首页 > 解决方案 > 子模型更新 Django ForeignKey 关系中的父模型

问题描述

假设以下模型架构,

父模型:

class Batch(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()

许多子模型之一:

class Data(models.Model):
    batch = models.ForeignKey(Batch, on_delete=models.ON_CASCADE)
    timestamp = models.DateTimeField()

我的目标如下:拥有一个父模型的起始字段,该字段在任何子模型被修改时始终更新。基本上,如果新数据实例的时间戳早于开始字段,我希望将开始字段更新为该实例时间戳值。在删除作为最旧时间参考点的数据实例的情况下,我希望将批处理开始字段更新为第二旧的。反之亦然。

标签: django

解决方案


一种可能的方法是添加相关模型的发布或预保存信号,并根据此更新您的必要字段。信号的 Django 官方文档,链接。我想添加另一个链接,这是我见过的关于 django 信号的最好的博客文章之一。

编辑安德烈·格拉回应

进行获取呼叫并带来 Batch 实例的最简单方法之一。我想说什么

@receiver(post_save,sender=Data)
def on_batch_child_saving(sender,instance,**kwargs):
    batch_instance = Batch.objects.get(pk=instance.batch)
    if (instance.timestamp < batch_instance.start): 
        batch_instance.start = instance.timestamp
        batch_instance.save()

    elif (instance.timestamp > batch_instance.end):
        batch_instance.end = instance.timestamp
        batch_instance.save()

推荐阅读