为什么 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.objects.get(id=8)
<User: tg>
注意:另外, id=8 在这里被回收。它已经为先前的记录提供,然后已被删除。
编辑
即使是 django 管理也无法添加引用该用户的领域记录。但奇怪的是,没有被回收的旧记录(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
);