5

Django 文档建议复制模型实例

original.pk = None
original.save()

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

具体来说,文档说:

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

并给出一个类似的例子:

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

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

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

4

1 回答 1

8

这是因为 MTI(Multiple Table Inheritance),即您在此处讨论的类型,将对象存储在多个表中。举个例子:

class Animal(models.Model):
    ...

class Dog(Animal):
    ...

创建aDog时,所有的字段Animal都保存到表中Animal,只有直接上的字段Dog保存到表中Dog。当您查找Dog后者时,Django 会查询这两个表并将它们拼接在一起。

然而,这两个表都需要主键,而 Django 使用AutoFields ,它们只是正整数字段。所以Dog有一个id,Animal也有一个id。用零件pk的 id 填充,Animal因为这是主要部分,而Dogid 无关紧要。但是,如果您要制作副本,则需要复制两个部分。否则,副本的Animal部分将不会得到它自己Dog的副本部分。

于 2012-08-10T15:03:27.057 回答