2011-07-21 12 views
2

私たちがやっているDjangoプロジェクトとpostgresqlデータベースには小さな問題があります。Django AutoFieldが新しいprimary_keyを返さない

私たちが取り組んでいるプロジェクトは、PHPサイトからdjangoサイトへのサイト/ db変換です。そこで、PHPをバックエンドからモデルを生成するためにinspect dbを使用しました。

それは私達にこれを与え、我々はPRIMARY_KEYとユニークがTrue等しい追加:

class Company(models.Model): 
    companyid = models.IntegerField(primary_key=True,unique=True) 
    ... 
    ... 

我々は最終的には新しい会社のエントリを保存するようになった時に働いているように見えなかったこと。これは、非NULL制約エラーを返しますので、私たちは以下のようなのAutoFieldに移行:

class Company(models.Model): 
    companyid = models.AutoField(primary_key=True) 
    ... 
    ... 

これは、当社のエントリー罰金を節約できますが、問題は、我々は

result = form.save() 

を行うときに私たちができないですデータベースに新しく与えられた主キーを取得するには(まだ我々はそれがデータベースに適切な企業IDを付与されていることがわかります

result.pk or result.companyid 

を行う。

私たちは何が起こっているのか迷っています。どんなアイデアや答えも大変ありがとうございます。

答えて

4

私はちょうど同じことに遭遇しましたが、多くの歴史を持つプロジェクトのdjangoをアップグレードしていました。痛い...

とにかく、問題は、djangoのpostgresqlバックエンドが新しく作成されたオブジェクトの主キーを取得する方法に起因すると思われます。pg_get_serial_sequenceを使用して、テーブルの主キーのシーケンスを解決します。私の場合、id列はserialタイプではなく、integerで作成されました。これは、自分のシーケンスがtable.columnに正しく接続されていないことを意味します。

次のcreate文でテーブルに基づいており、あなたの状況に応じて、テーブル名、列と列名を調整する必要があります:あなたは、PostgreSQLを使用している場合

CREATE TABLE "mike_test" (
    "id" integer NOT NULL PRIMARY KEY, 
    "somefield" varchar(30) NOT NULL UNIQUE 
); 

ソリューションを8.3以降はかなり簡単です:

ALTER SEQUENCE mike_test_id_seq OWNED BY mike_test.id; 

あなたが8.1を使っているのであれば、少しばかりです。あなたの列は、他の制約に関与している場合、あなたはそれをさらに楽しくする必要があります

ALTER TABLE mike_test ADD COLUMN temp_id serial NOT NULL; 
UPDATE mike_test SET temp_id = id; 
ALTER TABLE mike_test DROP COLUMN id; 
ALTER TABLE mike_test ADD COLUMN id serial NOT NULL PRIMARY KEY; 
UPDATE mike_test SET id = temp_id; 
ALTER TABLE mike_test DROP COLUMN temp_id; 
SELECT setval('mike_test_id_seq', (SELECT MAX(id) FROM mike_test)); 

:私は、次の(最も簡単な)ケースで、私のコラムを再作成しました。

関連する問題