Django - 我应该何时使用信号,何时应该覆盖保存方法?

时间:2016-03-11 20:55:48

标签: django django-models django-signals

我个人喜欢使用signals

from django.db import models
from django.db.models.signals import pre_save

class MyModel(models.Model):

    ...

def custom_action_before_saving(sender, instance, *args, **kwargs):
    ...

pre_save.connect(custom_action_before_saving, sender=MyModel)

但是我想知道在模型类中有更好的时间或任务是否更好override the save method

from django.db import models

class MyModel(models.Model):
    ...

    def save(self):
        ...
        super(MyModel, self).save()

我问这个是因为在Django的文档页面中有一个覆盖save()方法(上面提供的链接)的例子,所以我认为这不是一个坏习惯。

我们以pre_save()为例,文档说:

  

这是在模型的save()方法的开头发送的。

这是否意味着覆盖save与使用信号的性能具有相同的效果?

2 个答案:

答案 0 :(得分:6)

您不会发现任何性能差异。它们都不是黑客或“错误的”编码方法。这就是你喜欢它的方式。

如果在覆盖保存方法或从其他地方保存时获得循环导入,则可以使用信号。

我遵循一种模式,如果更改属于同一模型,则覆盖save方法,否则如果它们属于未链接到当前模型的不同模型(一对一或一对多),使用信号。

答案 1 :(得分:0)

在覆盖保存方法还是利用信号之间进行选择实际上并不是性能或最佳实践的问题。由于the documentation says信号主要是使应用程序保持解耦,同时又能够彼此通信的好方法。

与覆盖save方法相比,与Celery组合以将某些处理卸载到后台也更加自然。