Django ORM在外键上连接两个模型

2024-04-29 03:51:49 发布

您现在位置:Python中文网/ 问答频道 /正文

标题可能有误导性,我不确定如何表达我的问题

我有两个模型是这样声明的:

class Record(models.Model):
    # autogen id as primary key
    name = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
    value = models.FloatField()
    date = models.DateTimeField()


class Integration(models.Model):
    # autogen id as primary key
    action = models.FloatField()
    on_record = models.ForeignKey(Record, on_delete=models.DO_NOTHING)

我一整年每天每小时有一个Record,因此是24*365。
对于每个Record,确切地说有十(10)个Integration,每个都有各自不同的action

我需要的是Record上的一个查询集,它有一个“额外列”,其中包含相关10个集成的action的平均值。所以

记录

^{tb1}$

集成

^{tb2}$

我需要什么

^{tb3}$

我能够用这种方法生成Integration的平均值

Integration.objects
    .values('on_record')
    .annotate(avg=Avg('action'))

但这是我所能做到的。我试过itertools.chain和许多select_related(),但我现在比以前更困惑了。在我看来,它是一个简单的JOIN,但我找不到通过ORM获得它的方法


Tags: keyidmodelonmodelsasactionrecord
2条回答

如果更改模型的成本不高,则可以将相关名称添加到FK字段:

class Record(models.Model):
    # autogen id as primary key
    name = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
    value = models.FloatField()
    date = models.DateTimeField()


class Integration(models.Model):
    # autogen id as primary key
    action = models.FloatField()
    on_record = models.ForeignKey(Record, on_delete=models.DO_NOTHING, related_name='integration')

然后可以执行以下查询:

Record.objects.all().annotate(integration_avg_action=Avg('integration__action')).values('name', 'value', 'date', 'integration_avg_action')

因为您需要一个Record的查询集,所以应该在该查询集上进行注释,而不是在Integration上进行注释。有关聚合,请参见文档中的Following relationships backwards部分

Record.objects.annotate(integration_avg_action=Avg('integration__action'))

相关问题 更多 >