Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:何时使用post save信号自定义save vs_Python_Django_Save_Receiver - Fatal编程技术网

Python Django:何时使用post save信号自定义save vs

Python Django:何时使用post save信号自定义save vs,python,django,save,receiver,Python,Django,Save,Receiver,我在数据库中有一系列的测试和案例。每当一个测试被淘汰时,它都会被注明结束日期,并且该测试的任何子案例也应该被注明结束日期。我认为有两种方法可以做到这一点: 1) 修改保存功能以结束日期子案例。 2) 创建一个接收器,用于侦听正在保存的测试模型,然后结束其子案例的日期 有什么理由使用另一个而不是另一个 编辑:我发现这建议您在检查模型的给定值时使用save方法。因为我正在检查结束日期,也许这建议我应该使用自定义保存 Edit2:此外,对于记录,完整的层次结构是协议->测试->案例->计划执行,并且任

我在数据库中有一系列的测试和案例。每当一个测试被淘汰时,它都会被注明结束日期,并且该测试的任何子案例也应该被注明结束日期。我认为有两种方法可以做到这一点:

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

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

编辑:我发现这建议您在检查模型的给定值时使用save方法。因为我正在检查结束日期,也许这建议我应该使用自定义保存

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

Edit3:为了判断当前save()是否是结束测试的save(),我需要访问旧数据和新数据,因此我使用了自定义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()

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

  • 如果必须修改数据以使保存不会失败,请重写
    save()
    (您实际上没有其他选项)。例如,在我正在开发的一个应用程序中,我有一个带有文本字段的模型,其中包含一个选项列表。这将与旧代码交互,并替换具有类似文本字段但具有不同选项列表的旧模型。旧代码有时会将旧模型中的选项传递给我的模型,但选项之间有1:1的映射,因此在这种情况下,我可以将选项修改为新的。在
    save()
    中执行此操作很有意义
  • 否则,如果保存可以在没有干预的情况下继续,我通常使用保存后信号

据我所知,信号是模块解耦的一种手段。因为您的任务似乎只发生在一个模块中,所以我要自定义保存。

或者更具体地说,在需要操作对象本身时使用保存。这意味着您的对象的方法在代码的其他地方具有较少的“副作用”,这使得维护更加容易。我只想补充一点,您可能应该在save中接受*args和**kwargs,并将它们传递给super,以防有人想使用update\u save或force\u insert等参数。