Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子模型更新Django ForeignKey关系中的父模型_Django - Fatal编程技术网

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

子模型更新Django ForeignKey关系中的父模型,django,Django,假设以下模型为模式 父模型: 众多子模型之一: 我的目标如下:在修改任何子模型时,父模型的起始字段始终更新。 基本上,如果一个新数据实例的时间戳早于开始字段,我希望开始字段更新为该实例的时间戳值。在删除最早的时间参考点数据实例的情况下,我希望批次开始字段更新为第二个最早的时间。结束字段也一样。一种可能的方法是添加相关模型的post或pre save信号,并根据此信息更新必要的字段。Django信号的官方文件。我想添加另一篇关于django signal的最好的博客文章 编辑AndréGuerra

假设以下模型为模式

父模型: 众多子模型之一: 我的目标如下:在修改任何子模型时,父模型的起始字段始终更新。
基本上,如果一个新数据实例的时间戳早于开始字段,我希望开始字段更新为该实例的时间戳值。在删除最早的时间参考点数据实例的情况下,我希望批次开始字段更新为第二个最早的时间。结束字段也一样。

一种可能的方法是添加相关模型的post或pre save信号,并根据此信息更新必要的字段。Django信号的官方文件。我想添加另一篇关于django signal的最好的博客文章

编辑AndréGuerra回复 执行get调用并带来批处理实例的最简单方法之一。我想说什么

@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()
@receiver(保存后,发送方=数据)
批处理子项保存时的定义(发送方、实例,**kwargs):
batch\u instance=batch.objects.get(pk=instance.batch)
如果(instance.timestampbatch_instance.end):
batch_instance.end=instance.timestamp
批处理\u实例。保存()

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

@receiver(保存后,发送方=数据)
批处理子项保存时的定义(发送方、实例,**kwargs):
if(instance.timestampinstance.batch.end):
instance.batch.end=instance.timestamp
instance.batch.save()
class Data(models.Model):
    batch = models.ForeignKey(Batch, on_delete=models.ON_CASCADE)
    timestamp = models.DateTimeField()
@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()
@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()