加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

django – 为什么我不能在编辑后保存我的模型实例?

发布时间:2020-12-16 22:53:15 所属栏目:Python 来源:网络整理
导读:我有一个模型,我可以很好地实例化,但一旦创建,如果我试图保存它我得到一个IntegrityError说主键必须是唯一的.是什么导致了这个? 还有其他模型继承自Node,他们给了我同样的问题. 这是我的模特: class Node(MPTTModel): title = models.CharField(max_length
我有一个模型,我可以很好地实例化,但一旦创建,如果我试图保存它我得到一个IntegrityError说主键必须是唯一的.是什么导致了这个?

还有其他模型继承自Node,他们给了我同样的问题.

这是我的模特:

class Node(MPTTModel):
    title = models.CharField(max_length=255)
    parent = models.ForeignKey('self',null=True,blank=True,related_name='children')

class Book(Node):
    isbn13 = models.CharField(max_length=14)
    description = models.TextField()

这是它生成的SQL:

CREATE TABLE "main_node" (
    "id" integer NOT NULL PRIMARY KEY,"title" varchar(255) NOT NULL,"parent_id" integer,"type" varchar(1) NOT NULL,"lft" integer unsigned NOT NULL,"rght" integer unsigned NOT NULL,"tree_id" integer unsigned NOT NULL,"level" integer unsigned NOT NULL
)
;
CREATE TABLE "main_book" (
    "node_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "main_node" ("id"),"isbn13" varchar(14) NOT NULL,"description" text NOT NULL
)
;

当我尝试保存预先存在的模型实例时会发生什么:

>>> b = Book.objects.create(title='c+ for dummies',isbn13='111-2222222222',description='nt')
>>> b.title='c++ for dummies'
>>> b.save()
Traceback (most recent call last):
  File "<console>",line 1,in <module>
  File "C:UsersJackieDesktopCodeProjectNamemainmodels.py",line 56,in save
    super(Book,self).save(self,*args)
  File "C:Python27libsite-packagesdjangodbmodelsbase.py",line 460,in save
    self.save_base(using=using,force_insert=force_insert,force_update=force_update)
  File "C:Python27libsite-packagesdjangodbmodelsbase.py",line 553,in save_base
    result = manager._insert(values,return_id=update_pk,using=using)
  File "C:Python27libsite-packagesdjangodbmodelsmanager.py",line 195,in _insert
    return insert_query(self.model,values,**kwargs)
  File "C:Python27libsite-packagesdjangodbmodelsquery.py",line 1436,in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:Python27libsite-packagesdjangodbmodelssqlcompiler.py",line 791,in execute_sql
    cursor = super(SQLInsertCompiler,self).execute_sql(None)
  File "C:Python27libsite-packagesdjangodbmodelssqlcompiler.py",line 735,in execute_sql
    cursor.execute(sql,params)
  File "C:Python27libsite-packagesdjangodbbackendsutil.py",line 34,in execute
    return self.cursor.execute(sql,params)
  File "C:Python27libsite-packagesdjangodbbackendssqlite3base.py",line 234,in execute
    return Database.Cursor.execute(self,query,params)
IntegrityError: PRIMARY KEY must be unique

以下是运行的查询:

>>> for q in connection.queries:
...   print q['sql'] + "nn"
...
SELECT MAX("main_node"."tree_id") AS "tree_id__max" FROM "main_node"


INSERT INTO "main_node" ("title","parent_id","type","lft","rght","tree_id","level") VALUES (c+
 for dummies,None,B,1,2,0)


INSERT INTO "main_book" ("node_ptr_id","isbn13","description") VALUES (1,111-2222222222,nt)




SELECT (1) AS "a" FROM "main_node" WHERE "main_node"."id" = 1  LIMIT 1


UPDATE "main_node" SET "title" = c++ for dummies,"parent_id" = NULL,"type" = B,"lft" = 1,"rght"
= 2,"tree_id" = 1,"level" = 0 WHERE "main_node"."id" = 1


INSERT INTO "main_book" ("node_ptr_id",nt)

当我重新保存已创建的实例时,为什么要尝试插入main_book?

解决方法

你是否在你的任何模特中超越了“save()”方法?我有一个类似的问题,经过大量的挖掘,发现这是因为我过度使用的“保存()”中的一个小错误.

你能发布一下你的模型定义吗? (从生成的SQL中,看起来你发布的内容不完整)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读