我正在一个项目中,我需要根据字段是否更改来重新计算值。这是一个示例:
Model1:
field_a = DatetimeField()
calculated_field_1 = ForeignKey(Model2)
Model2:
field_j = DatetimeField()
如果field_a在model1上发生更改,则我必须重新计算字段calculated_field_1的值,以查看它是否也需要更改。完成的计算需要我查询数据库以检查其他模型的值,然后确定所计算字段的值是否需要更改。
示例)field_a发生变化,那么我将不得不执行此计算
result = Model2.objects.filter(field_j__gte=Model1.field_a)
If result.exists():
Model1.field_a = result.first()
Model1.save(update_fields=(‘field_a’,))
这是我能想到的最基本的示例,查询要比这复杂得多。
当字段更改时,该项目以一个计算开始,所以我决定最好的方法是使用Django信号。几个月后,该项目的需求发生了变化,现在我还必须执行其他一些计算,这些计算与上面的示例非常相似。我注意到我的post_save函数失控了,我只是想知道使用信号有什么替代方法。尽管我现在进行的post_save计算远远少于半秒,但出于我的问题,我假设它们花了一秒或更长时间。
当我从数据库中提取它们时,有效答案不能包括即时进行这些计算。我们使用一个验证框架,该框架要求我在模型上设置这些值,而即时查询是我们尝试的一种方法,但是由于性能原因,它是不可行的。另外,在字段更改时,要求之一是用户需要查看计算字段的结果,因此必须同步进行。
使用此模式有哪些替代方法?