有时你想在模型事件发生时做某事(在创建对象上,在更新对象上,在删除对象上)。
您可以在名为Model
的{{1}}中覆盖一种方法。它甚至有一个参数save
,我首先认为它总是被设置为一个正确的值,这意味着是否将创建或更新一个对象。但是参数是可选的,你不能指望它是正确的。
在forced_insert
的源代码中搜索引导我使用方法Model
和_do_update
,但是开头的下划线告诉我不建议使用此方法。它还有很多参数,当你覆盖它时会污染代码。
我能找到的唯一解决方案是使用_do_insert
。但我相信它们可能用于外部目的,例如当您想要在每个django.db.models.signals
创建时创建UserProfile
时。但我有一些内部目的,如更新更新字段。使用信号也会使代码看起来更加分散,更难以理解。
在这些User
事件中实施功能的正确方法是什么?
答案 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