Django CMS复制模型实例问题

时间:2014-09-15 11:06:59

标签: django python-2.7 virtualenv django-cms django-1.6

我在使用Django CMS 3.0插件模型copy_relations时遇到了一些问题。 来自documentation

的示例
def copy_relations(self, oldinstance):
    for associated_item in oldinstance.associated_item.all():
        # instance.pk = None; instance.pk.save() is the slightly odd but
        # standard Django way of copying a saved model instance
        associated_item.pk = None
        associated_item.plugin = self
        associated_item.save()

无效,CMS仅修改插件模型的实例。在此示例中,我需要添加associated_item.id = None才能正常工作。 这不是我的第一个Django CMS项目,但是在3.0中是第一个。在之前的版本中,我确实按照文档进行操作,一切正常,但不是这次。

问题是:文档是不是最新的,或者在创建模型的过程中我做错了什么?

修改 Here是我发现如何让Django CMS保存模型实例的副本的地方:

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

我需要为copy_relations的所有模型执行此操作,并且我想知道为什么需要这样做。

1 个答案:

答案 0 :(得分:2)

显然,在你的情况下,associated_item指向一个继承自另一个模型的模型。 Django中有两种类型的模型继承:abstract and multi-table

在抽象继承的情况下,基本模型是抽象的,即它不在数据库中,只是作为从中继承的模型的模板。

在多表继承的情况下,所有模型都在DB中,子模型通过ForeignKey链接到基本模型。

对于常规模型.pk.id是同一件事(您甚至可以使用my_model.pk is my_model.id进行检查),而对于多表子模型.id则是基本模型的id字段,.pk是用于将子模型连接到基本模型的ForeignKey。实际上,.pk.id的数值仍然相同(因为.pk指向.id),但它们仍然是数据库中的两个独立列。在我看来,这个Django设计决定有些不一致,但这就是我们所拥有的。

这就是为什么你需要将两个字段都设置为None以使Django失去对模型的跟踪并将其视为新的模型实例。