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

python – Django完整性错误_id可能不为null,ForeignKey id赋

发布时间:2020-12-16 23:54:58 所属栏目:Python 来源:网络整理
导读:我在理解Django(v1.6.5)在保存时将id分配给不同对象的方式时遇到了问题.以最小的例子: #models.pyclass Book(models.Model): title = models.CharField(max_length=10)class Page(models.Model): number = models.SmallIntegerField() book = models.Foreig

我在理解Django(v1.6.5)在保存时将id分配给不同对象的方式时遇到了问题.以最小的例子:

#models.py

class Book(models.Model):
    title = models.CharField(max_length=10)

class Page(models.Model):
    number = models.SmallIntegerField()
    book   = models.ForeignKey(Book)

保存my_page时,以下视图会抛出“IntegrityError,book_id可能不为NULL”,但是我倾向于说book_id确实存在,因为在该阶段已经为该书调用了save().

#view.py

my_book = Book(title="My book")

#solution1 : having my_book.save() here

my_page = Page(number = 1,book = my_book)
my_book.save()
print("book id",my_page.book.id) #book.id does exist at that point!

#solution2: my_page.book = my_book

my_page.save()   #throws the IntegrityError exception

有一些简单的解决方案可以使代码在上面工作,但我想知道第一种方法有什么问题.我错过了什么,或者是Django处理ForeignKeys的方式的故障/限制?

最佳答案
我明白你的观点,但目前的行为似乎更明确. my_book只是一个Python对象,它的所有属性(包括id)都可以改变.因此,假设用户想要在实例化时存在的值似乎更安全.

例如,Django idiom for copying a database row涉及重用相同的对象来表示多个模型实例.在你的情况下,可能看起来像:

my_book = Book(title="My book")
my_page = Page(number=1,book=my_book)
my_book.save()

my_book.id = None
my_book.save()  # copy the book to a new row with a new id

my_page.save()

那么my_page指向哪本书呢?我认为开发人员要求你在这里明确是正确的. the associated ticket的解决方案将更加直接,因为如果尚未保存my_book,则在尝试实例化my_page时会出现ValueError.

(编辑:李大同)

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

    推荐文章
      热点阅读