25

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

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

有什么理由使用另一个而不是另一个?

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

Edit2:此外,为了记录,完整的层次结构是协议->测试->案例->计划执行,并且任何时候结束日期,每个孩子也必须结束日期。我想我最终会为每个人做基本相同的事情。

Edit3:事实证明,为了判断当前的 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()
4

2 回答 2

29

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

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

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

于 2011-04-08T15:39:33.333 回答