2

作成したばかりのキーを参照するレコードを作成するときに、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
);
4

0 に答える 0