这是我的简化模型:
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 。例如实例i1
类Item
有 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)
我需要一个查询来检索 i1
用 tp1.data
注释的实例字段值为 tp1
是created
订购的最新跟踪点 field 。该查询还应返回 Item
没有任何 TrackingPoint
的根本就是如果可能的话,我不想使用 QuerySet
的 extra
方法来做到这一点。
这就是我到目前为止所尝试的......但失败了:(
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/