Django:覆盖模型中的插入,更新,删除

时间:2018-03-05 16:50:50

标签: python django django-models

有时你想在模型事件发生时做某事(在创建对象上,在更新对象上,在删除对象上)。

您可以在名为Model的{​​{1}}中覆盖一种方法。它甚至有一个参数save,我首先认为它总是被设置为一个正确的值,这意味着是否将创建或更新一个对象。但是参数是可选的,你不能指望它是正确的。

forced_insert的源代码中搜索引导我使用方法Model_do_update,但是开头的下划线告诉我不建议使用此方法。它还有很多参数,当你覆盖它时会污染代码。

我能找到的唯一解决方案是使用_do_insert。但我相信它们可能用于外部目的,例如当您想要在每个django.db.models.signals创建时创建UserProfile时。但我有一些内部目的,如更新更新字段。使用信号也会使代码看起来更加分散,更难以理解。

在这些User事件中实施功能的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

从django base Model _save_table方法看这个简化条件 - 更新或插入的决定取决于模型pk和force_insert值:

   def _save_table(self, raw=False, cls=None, force_insert=False,
                    force_update=False, using=None, update_fields=None):
        updated = False
        # ...
        if pk_set and not force_insert:
            updated = self._do_update()
        if not updated:
            result = self._do_insert()
        # ...
        return updated

如果您想完全自定义更新/插入操作,您可以在覆盖的保存方法中采用相同的方式:

def save(self, force_insert=False, **kwargs):
    updated = False
    if self.pk and not force_insert:
        updated = self.custom_update()
    if not updated:
        self.custom_insert()
    return updated