使用Django 2.2
我有两个模型,Job
和Operation
,其中Operation
与Job
具有外键关系(即,一个作业可以有0个或多个操作)。
我希望人们使用inlines通过Django Admin界面一起输入有关作业和操作的信息。 (这意味着,在管理站点上的作业创建/编辑页面上,用户可以“内联”添加一个或多个操作,而无需离开页面。)
Job
有一些根据其相关操作计算得出的字段。我希望它们不是常规的计算字段@property
,而是希望它们成为常规数据库字段,这些字段在操作通过信号更改时会更新。看起来像这样:
class Job(models.Model):
name = models.CharFields(...)
def compute_fields(self):
qs = self.operations.filter(...) # get data from operations
self.name = ... # set properties using that data
self.save()
...
class Operation(models.Model):
job = models.ForeignKey(Job, related_name="operations", on_delete=models.CASCADE)
...
@receiver(post_save, sender=Operation)
def update_job_on_operation_save(sender, instance, **kwargs):
"""Update job fields when an operation is saved"""
instance.job.compute_fields()
这是问题所在:如果有人在Django Admin上编辑Job
表单,并且他们在点击保存之前添加了内联多个操作,那么接收器函数会同时被多次调用。我有点担心竞争状况,以及每个导致Job
重新计算某些属性并保存到数据库的信号的无效性。
将接收器附加到Job
也许会更好,因此该函数只被调用一次,但是如果有人要在Operation
格式之外编辑Job
也会触发重新计算。
是否可以为post_save
和Job
设置类似的Operation
接收者,并说“如果将作业作为作业表单的一部分进行内联编辑,则忽略该操作接收者”?有替代解决方案吗?