我在缠绕这个问题时遇到了麻烦.现在我有一些看起来像这样的模型:
def Review(models.Model) ...fields... overall_score = models.FloatField(blank=True) def Score(models.Model) review = models.ForeignKey(Review) question = models.TextField() grade = models.IntegerField()
评论有几个"分数",整体分数是分数的平均值.保存评论或分数时,我需要重新计算total_score平均值.现在我正在使用重写的保存方法.使用Django的信号调度程序会有什么好处吗?
保存/删除信号通常适用于需要进行不完全特定于相关模型的更改的情况,或者可以应用于具有某些共同点的模型,或者可以配置为跨模型使用的模型.
重写save
方法中的一个常见任务是从模型中的某些文本字段自动生成段塞.这是一个例子,如果你需要为许多模型实现它,将会受益于使用pre_save
信号,其中信号处理程序可以采用slug字段的名称和字段的名称来生成slug.一旦你有了这样的东西,你所实施的任何增强功能也将适用于所有模型 - 例如查找你要为所讨论的模型类型添加的slug,以确保唯一性.
可重复使用的应用程序通常受益于信号的使用 - 如果它们提供的功能可以应用于任何模型,它们通常(除非它是不可避免的)不希望用户必须直接修改他们的模型才能从中受益.
例如,使用django-mptt,我使用该pre_save
信号来管理一组字段,这些字段描述了即将创建或更新的模型的树结构,以及pre_delete
用于删除要删除的对象的树结构细节的信号及其整个它之前的对象的子树,它们被删除.由于信号的使用,用户不必在他们的模型上添加或修改save
或delete
方法来为他们完成这种管理,他们只需要让django-mptt知道他们想要管理哪些模型.
您询问:
使用Django的信号调度程序会有什么好处吗?
我在django文档中发现了这个:
在批量操作上不会调用重写的模型方法
请注意,使用QuerySet批量删除对象或作为级联删除的结果时,不一定要调用对象的delete()方法.要确保执行自定义删除逻辑,您可以使用pre_delete和/或post_delete信号.
遗憾的是,在批量创建或更新对象时没有解决方法,因为没有调用save(),pre_save和post_save.
From:覆盖预定义的模型方法