Python 一对多相关对象上的Django聚合查询
这是我的简化模型:Python 一对多相关对象上的Django聚合查询,python,django,orm,django-orm,django-aggregation,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') 在我的应
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')
在我的应用程序的许多部分中,我需要检索一组项目
,并使用数据
字段从最新的跟踪点
从创建的
字段排序的每个项目中对每个项目进行注释。例如,类项
的实例i1
有3个跟踪点
:
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)
我需要一个查询来检索用tp1注释的i1
实例。数据字段值为tp1
是由创建的字段排序的最新跟踪点。该查询还应返回根本没有任何跟踪点的项。如果可能的话,我不希望使用QuerySet
的extra
方法来完成此操作
这就是我到目前为止试过的。。。但失败了:(
有什么想法吗?这不是对您问题的直接回答,但如果您不需要您所描述的内容,您可能会对Best-n-per-group解决方案感兴趣。您可以查看我对类似问题的回答:
--这应直接适用于您的案例:
items = Item.objects.annotate(tracking_point_created=Max('trackingpoint__created'))
trackingpoints = TrackingPoint.objects.filter(created__in=[b.tracking_point_created for b in items])
请注意,如果在TrackingPoint模型中重复创建日期,则第二行可能会产生不明确的结果。这里有一个查询,它将提供(TrackingPoint,Item)-对:
您必须在不单独跟踪点的情况下查询项目。您的解决方案会迭代所有项目
,我负担不起。创建的
在一个项目中是唯一的,我已更新了我的问题。
items = Item.objects.annotate(tracking_point_created=Max('trackingpoint__created'))
trackingpoints = TrackingPoint.objects.filter(created__in=[b.tracking_point_created for b in items])
TrackingPoint.objects.annotate(max=Max('item__trackingpoint__created')).filter(max=F('created')).select_related('item').order_by('created')