gpt4 book ai didi

django - 为什么必须将 id 和 pk 设置为 None 才能复制带有继承的 Django 模型?

转载 作者:行者123 更新时间:2023-12-02 06:42:41 27 4
gpt4 key购买 nike

Django 文档推荐 copying a model instance因此:

original.pk = None
original.save()

但是如果你“使用继承”——显然意味着模型的类是 models.Model 子类的子类——你需要稍微不同地做。

具体来说,文档说:

Due to how inheritance works, you have to set both pk and id to None:

并给出了一个与此类似的示例:

original.pk = None
original.id = None
original.save()

这看起来很笨拙。无论如何,我想了解发生了什么事。为什么使用继承还需要将 id 字段设置为 None ?在任何情况下,不是所有 Django 模型都继承自 models.Model 吗?

(注意:我省略了文档中有关复制 m2m 字段的部分,顺便说一句,这看起来更加困惑。)

最佳答案

这是因为您在这里讨论的 MTI(多表继承)类型跨多个表存储对象。举个例子:

class Animal(models.Model):
...

class Dog(Animal):
...

当您创建Dog时, Animal 上的所有字段保存到表中 Animal ,以及直接位于 Dog 上的字段保存到表 Dog 。当您查找Dog时随后,Django 查询这两个表并将它们拼接在一起。

但这两个表都需要主键,Django 使用 AutoField s 就是这样,它们只是正整数字段。所以Dog有一个 id 和 Animal有一个id。 pk填充了 Animal 的 id部分,因为这是主要部分,并且 Dog的id并不重要。但是,如果您要复制,则需要复制两部分。否则,Animal副本的部分意志不会得到它自己的Dog副本的一部分。

关于django - 为什么必须将 id 和 pk 设置为 None 才能复制带有继承的 Django 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11904221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com