【问题标题】:Django: When to customize save vs using post-save signalDjango:何时自定义保存与使用保存后信号
【发布时间】:2011-08-01 15:03:56
【问题描述】:

我在数据库中有一系列测试和案例。每当一个测试被废弃时,它就会被标记为结束日期,并且该测试的任何子案例也应该被标记为结束日期。我看到了两种方法来实现这一点:

1) 修改保存功能以结束日期子案例。
2)创建一个接收器来监听正在保存的测试模型,然后结束它们的子案例的日期。

有什么理由使用其他的吗?

编辑:我看到blog post 建议在检查模型的给定值时使用 save 方法。由于我正在检查 end_date,也许这表明我应该使用自定义保存?

Edit2:另外,为了记录,完整的层次结构是 Protocol -> Test -> Case -> Planned_Execution,并且任何时候 end_dated,每个孩子也必须 endDated。我想我最终会为每个人做基本相同的事情。

Edit3:原来为了判断当前的save()是否是endDating Test的那个,我需要访问旧数据和新数据,所以我使用了自定义保存。这是它的样子:

def save(self):
    """Use a custom save to end date any subCases"""
    try:
        orig = Test.objects.get(id=self.id)
        enddated = (not orig.end_date) and self.end_date is not None   
    except:
        enddated = False

    super(Test, self).save()

    if enddated:
        for case in self.case_set.exclude(end_date__isnull=False):
            case.end_date = self.end_date
            case.enddater = self.enddater
            case.save()

【问题讨论】:

  • 我想补充一点,您可能应该在 save 中接受 *args 和 **kwargs 并将它们传递给 super 以防有人想要使用 update_save 或 force_insert 之类的参数。

标签: python django save receiver


【解决方案1】:

我通常使用这个经验法则:

  • 如果您必须修改数据以确保保存不会失败,请覆盖save()(您实际上没有其他选择)。例如,在我正在开发的应用程序中,我有一个模型,其中包含一个包含选项列表的文本字段。这与旧代码接口,并替换具有相似文本字段但具有不同选项列表的旧模型。旧代码有时会通过我的模型从旧模型中选择一个选项,但选项之间存在 1:1 映射,因此在这种情况下,我可以将选项修改为新模型。在save() 中这样做是有意义的。
  • 否则,如果无需干预即可进行保存,我一般会使用保存后信号。

【讨论】:

  • 或者更具体地说 - 当您需要操作对象本身时使用保存。这意味着您的对象的方法在代码的其他地方具有更少的“副作用”,这使得维护更加容易。
【解决方案2】:

在我的理解中,信号是解耦模块的一种手段。由于您的任务似乎只发生在一个模块中,我会自定义保存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2010-09-15
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多