Django:将信号与内联模型一起使用

时间:2019-04-04 17:35:40

标签: python django

使用Django 2.2

我有两个模型,JobOperation,其中OperationJob具有外键关系(即,一个作业可以有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_saveJob设置类似的Operation接收者,并说“如果将作业作为作业表单的一部分进行内联编辑,则忽略该操作接收者”?有替代解决方案吗?

0 个答案:

没有答案