Django:何时自定义保存与使用保存后信号

Nat*_*han 22 python django save receiver

我在数据库中有一系列测试和案例.每当测试被废弃时,它都会过时,并且该测试的任何子案例也应该过期.我认为有两种方法可以做到这一点:

1)将保存功能修改为结束日期子案例.
2)创建一个侦听正在保存的测试模型的接收器,然后结束其子案例的日期.

有没有理由使用另一个以外的人?

编辑:我看到这篇博文建议在检查模型的给定值时使用save方法.因为我正在检查end_date,也许这表明我应该使用自定义保存?

Edit2:另外,对于记录,完整的层次结构是Protocol - > Test - > Case - > Planned_Execution,并且只要一个end_dated,每个子节点也必须是endDated.我想我最终会为每个人做同样的事情.

编辑3:事实证明,为了判断当前的save()是否是结束测试的那个,我需要访问旧数据和新数据,所以我使用了自定义保存.这是它的样子:

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()
Run Code Online (Sandbox Code Playgroud)

mip*_*adi 25

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

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

  • 或者更具体一点 - 当您需要操纵对象本身时使用save.这意味着您的对象的方法在代码中的其他地方具有较少的"副作用",这使维护变得更加容易. (4认同)

jam*_*mon 15

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

  • +1:几乎没有理由搞乱信号. (7认同)