作成したばかりのキーを参照するレコードを作成するときに、django が「外部キーの欠落エラー」を報告するのはなぜですか?
このコードを見てください:
def doRegister(request,username, email, password):
user = User.objects.create_user( username, email, password )
realm = createWhereAvailable( user )
realm.save()
return redirect('index')
def createWhereAvailable( user ):
#some logic here... note: Realm extends django's Model
return Realm( x=x, y=y, user=user, name=generateRandomRealmName(x, y) )
doRegister ビューは、realm.save() で例外を発生させます。
IntegrityError at /myapp/doregister
ERREUR: une instruction insert ou update sur la table « myapp_realm » viole la contrainte de clé
étrangère « user_id_refs_id_9302d6bb »
DETAIL: La clé (user_id)=(8) n'est pas présente dans la table « myapp_user ».
翻訳できるもの"the key (user_id)=(8) can't be found in table myapp_user"
しかし、id=8 の User のレコードは存在します
> > User.objects.get(id=8)
<User: tg>
注: また、id=8 はここで再利用されています。その後削除された以前のレコードに対して既に指定されています。
編集
django 管理者でさえ、このユーザーを参照する Realm レコードを追加できません。しかし奇妙なことに、リサイクルされていない古いレコード (id=1) は問題ありません。
一部の人々が同様の問題(重複キー)を経験しているため、リサイクルに関連している可能性があると思われます:http://www.vlent.nl/weblog/2011/05/06/integrityerror-duplicate-key-value-violates-unique-制約/またはIntegrityErrorの重複キー値が一意の制約に違反しています - django/postgres
以下の表について詳しく説明しました
これは、manage.py sql コマンドの出力です。
BEGIN;
CREATE TABLE "myapp_realm" (
"id" serial NOT NULL PRIMARY KEY,
"user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED,
"name" varchar(30) NOT NULL,
#... some other fields stripped for consision
)
;
COMMIT;
pgadmin からのテーブルのシリアル化は次のとおりです。
CREATE TABLE myapp_realm
(
id serial NOT NULL,
user_id integer NOT NULL,
name character varying(30) NOT NULL,
#... some other fields
CONSTRAINT myapp_realm_pkey PRIMARY KEY (id),
CONSTRAINT user_id_refs_id_9302d6bb FOREIGN KEY (user_id)
REFERENCES myapp_user (id) MATCH Unknown
ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
)
WITH (
OIDS=FALSE
);