python - Django对相关一对多对象的聚合查询

标签 python django orm django-orm django-aggregation

这是我的简化模型:

class Item(models.Model):
    pass

class TrackingPoint(models.Model):
    item = models.ForeignKey(Item)
    created = models.DateField()
    data = models.IntegerField()

    class Meta:
        unique_together = ('item', 'created')

在我的应用程序的许多部分,我需要检索一组 Item的并用 data 注释每个项目最新字段 TrackingPoint来自 created 订购的每件商品 field 。例如实例i1Item有 3 TrackingPoint的:

tp1 = TrackingPoint(item=i1, created=date(2010,5,15), data=23)
tp2 = TrackingPoint(item=i1, created=date(2010,5,14), data=21)
tp3 = TrackingPoint(item=i1, created=date(2010,5,12), data=120)

我需要一个查询来检索 i1tp1.data 注释的实例字段值为 tp1created订购的最新跟踪点 field 。该查询还应返回 Item没有任何 TrackingPoint 的根本就是如果可能的话,我不想使用 QuerySetextra方法来做到这一点。

这就是我到目前为止所尝试的......但失败了:(

Item.objects.annotate(max_created=Max('trackingpoint__created'),
                      data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))

有什么想法吗?

最佳答案

这是将提供 (TrackingPoint, Item) 对的单个查询:

TrackingPoint.objects.annotate(max=Max('item__trackingpoint__created')).filter(max=F('created')).select_related('item').order_by('created')

您将不得不单独查询没有 TrackingPoints 的项目。

关于python - Django对相关一对多对象的聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2839145/

相关文章:

python - 在Django CreateView中使用当前用户初始化ForeignKey用户

django.utils.timezone.now 在默认 TimeField 中返回 UTC

java - 持久化没有 ID 的第三方类

php - 如何在 Yii 中保存数据并确保正确保存?

java - IBM Websphere JPA 配置 - 如何更新 persistence.xml

python - 在没有 Pywin32 的 Python 中检测 Vista/7 上的符号链接(symbolic link)(mklink)

python itertools组合逻辑

python - 将数据帧年份和月份合并到新对象Python中

python - Arduino 到 Raspberry crc32 检查

python - Django:DecimalField 值显示