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')