为什么要将id和pk都设置为None来复制带继承的Django模型?

Gho*_*r21 2 django django-models

Django文档建议复制模型实例:

original.pk = None
original.save()
Run Code Online (Sandbox Code Playgroud)

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

具体来说,文档说:

由于继承的工作原理,您必须将pk和id都设置为None:

并给出一个类似于这样的例子:

original.pk = None
original.id = None
original.save()
Run Code Online (Sandbox Code Playgroud)

这似乎很笨拙.无论如何,我想了解发生了什么.为什么使用继承要求您也将id字段设置为None?难道不是所有的Django模型都继承了models.Model吗?

(注意:我省略了关于复制m2m字段的文档中的位,这在顺便说一下似乎更加笨拙.)

Chr*_*att 6

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

class Animal(models.Model):
    ...

class Dog(Animal):
    ...
Run Code Online (Sandbox Code Playgroud)

创建a时Dog,所有字段Animal都保存到表中Animal,并且只将直接打开的字段Dog保存到表中Dog.当你查找更Dog晚的时候,Django会查询两个表并将它们拼接在一起.

然而,两个表都需要主键,而Django使用AutoFields来表示,这只是正整数字段.所以Dog有一个id并且Animal有一个id.在pk充满了ID为Animal一部分,因为这是主要的一块,和Dog人的身份并不重要.但是,如果您要复制,则需要复制这两个部分.否则,Animal副本的部分将不会获得它自己Dog的副本部分.