【问题标题】:Why can't I save my model with a generic relation twice in Django?为什么我不能在 Django 中使用通用关系两次保存我的模型?
【发布时间】:2011-02-13 17:31:08
【问题描述】:

我得到了一个模型 TrackedItem,它具有链接到它应该跟踪的任何模型的通用关系。

如果我这样做:

t = TrackedItem(content_object=MyModel)
t.save()
t.save()

我明白了:

IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")

确实,第一次保存创建了一个带有“1”的条目作为PK。但是第二次保存不应该插入,它应该更新。

我应该如何更新无法保存两次的模型?

用一个普通的模型,我想存多少就存多少。

编辑:它可能与通用关系完全无关。

我有一个被覆盖的保存,我在其中调用 super,这样:

super(TrackedItem, self).save(self, *args, **kwargs)

如果我这样做,它会起作用:

model.Model.save(self, *args, **kwargs)

【问题讨论】:

  • 是什么让你认为这与泛型关系有关?您是否有任何机会在此模型上自定义 save() 方法?
  • 你说得对,我正在使用自定义“保存”:-) 我要添加有关问题的信息?

标签: django save generic-relations


【解决方案1】:

您的问题很可能是因为错误使用了“super”。应该是这样的:

super(TrackedItem, self).save(*args, **kwargs)

【讨论】:

    【解决方案2】:

    我认为这是一个数据库事务问题。在两个保存电话之间是否有DB-Commit?也许您的视图在 transaction.commit_on_sucess 控制之下。

    2 种可能性:

      transaction.commit() # within transaction.commit_manually
    

      t.save(force_update=True) # 2nd save call
    

    【讨论】:

    • 不,这是一个非常基本的代码,我没有在任何地方使用提交。另外,grepping我使用的库不会向我显示任何“提交”。我尝试了“force_update”,但最终出现“ValueError:无法在模型保存中强制插入和更新。”
    • 好的,那么它在您的自定义保存中可能会失败(如 Botondus 所说)。查看问题中写的自定义保存。他们是一个错误的“自我”。它应该是这样的形式: super(TrackedItem, self).save(*args, **kwargs)
    猜你喜欢
    • 2020-06-18
    • 2023-01-07
    • 1970-01-01
    • 2014-10-31
    • 2010-12-04
    • 2017-08-12
    • 2019-10-25
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多