子模型更新Django ForeignKey关系中的父模型

时间:2018-11-12 12:25:18

标签: django

假设以下模型架构,

父模型:

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()

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

2 个答案:

答案 0 :(得分:1)

执行此操作的一种可能方法是添加相关模型的发布或预保存信号,并根据此信号更新所需的字段。信号的Django官方文档link。我想添加另一个link,这是我所见过的有关Django信号的最佳博客文章之一。

编辑AndréGuerra的回复

进行get调用并带来Batch实例的最简单方法之一。我想说的

data = {"Country": {}}
counter = 1

for cnt in range(0, 10):
    new_dic_name = "test" + str(counter) 
    data['Country'].update({new_dic_name : {
    "population": "data",
    "GDP": "data",
    "measureInVolume": "gallons"
     }})
     counter = counter + 1 

答案 1 :(得分:0)

基于Shakil的建议,我提出了以下建议:(我的疑问是如何保存父模型)

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

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