【问题标题】:Django - When should I use signals and when should I override save method?Django - 我什么时候应该使用信号,什么时候应该覆盖保存方法?
【发布时间】:2016-06-27 06:15:58
【问题描述】:

我个人喜欢使用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 对性能的影响与使用信号相同?

【问题讨论】:

标签: django django-models django-signals


【解决方案1】:

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

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

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

【讨论】:

  • 非常漂亮的图案(Y)
【解决方案2】:

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

与覆盖 save 方法相比,信号也感觉更自然,与 Celery 结合以将某些处理卸载到后台。

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2023-04-02
    • 2011-04-15
    相关资源
    最近更新 更多