我在使用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
的所有模型执行此操作,并且我想知道为什么需要这样做。
答案 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失去对模型的跟踪并将其视为新的模型实例。