【问题标题】:Django CMS copy model instance issueDjango CMS复制模型实例问题
【发布时间】:2014-11-08 21:33:40
【问题描述】:

我对 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 的模型执行此操作,我想知道为什么需要这样做。

【问题讨论】:

  • associated_item.pk = Noneassociated_item.id = None 本质上是一回事。你确定你没有遗漏别的东西吗?
  • 也许你的模型上有一个明确命名为pk的字段?
  • @VasilyAlexeev 不是pk。我需要为所有一对多模型执行此操作。
  • 如果您自己找到了答案,值得将其作为问题的答案发布并接受为正确答案。如果您回答自己的问题并会帮助以后发现此问题的人,那是完全可以的。
  • @VasilyAlexeev 很抱歉我的编辑不佳。我只是想知道我为什么需要这样做,我只找到how来修复它而不是why

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


【解决方案1】:

显然,在您的情况下,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 丢失模型并将其视为新模型实例。

【讨论】:

  • 我找到了解决方案。我从 CMSPlugin 类继承关联项目类,文档示例从 model.Models 继承。谢谢。
猜你喜欢
  • 2014-05-12
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2013-05-12
  • 2010-10-31
  • 2016-02-15
  • 2011-07-22
相关资源
最近更新 更多