当前位置:  开发笔记 > 编程语言 > 正文

Django信号与重写保存方法

如何解决《Django信号与重写保存方法》经验,为你挑选了2个好方法。

我在缠绕这个问题时遇到了麻烦.现在我有一些看起来像这样的模型:

 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的信号调度程序会有什么好处吗?



1> Jonny Buchan..:

保存/删除信号通常适用于需要进行不完全特定于相关模型的更改的情况,或者可以应用于具有某些共同点的模型,或者可以配置为跨模型使用的模型.

重写save方法中的一个常见任务是从模型中的某些文本字段自动生成段塞.这是一个例子,如果你需要为许多模型实现它,将会受益于使用pre_save信号,其中信号处理程序可以采用slug字段的名称和字段的名称来生成slug.一旦你有了这样的东西,你所实施的任何增强功能也将适用于所有模型 - 例如查找你要为所讨论的模型类型添加的slug,以确保唯一性.

可重复使用的应用程序通常受益于信号的使用 - 如果它们提供的功能可以应用于任何模型,它们通常(除非它是不可避免的)不希望用户必须直接修改他们的模型才能从中受益.

例如,使用django-mptt,我使用该pre_save信号来管理一组字段,这些字段描述了即将创建或更新的模型的树结构,以及pre_delete用于删除要删除的对象的树结构细节的信号及其整个它之前的对象的子树,它们被删除.由于信号的使用,用户不必在他们的模型上添加或修改savedelete方法来为他们完成这种管理,他们只需要让django-mptt知道他们想要管理哪些模型.



2> guettli..:

您询问:

使用Django的信号调度程序会有什么好处吗?

我在django文档中发现了这个:

在批量操作上不会调用重写的模型方法

请注意,使用QuerySet批量删除对象或作为级联删除的结果时,不一定要调用对象的delete()方法.要确保执行自定义删除逻辑,您可以使用pre_delete和/或post_delete信号.

遗憾的是,在批量创建或更新对象时没有解决方法,因为没有调用save(),pre_save和post_save.

From:覆盖预定义的模型方法


它还说:“不幸的是,批量创建或更新对象时没有解决方法,因为没有调用save(),pre_save和post_save。” -因此,我认为这不是这些方法之间的折衷。
Django管理列表视图使用批量删除...混淆,直到遇到这个花絮.
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有