3

这是我的简化模型:

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

在我的应用程序的许多部分中,我需要从按字段排序的每个项目中检索一组 's 并使用最新字段Item注释每个项目。例如,类的实例有 3 个:dataTrackingPointcreatedi1ItemTrackingPoint

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注释的实例,就像按字段排序的最新跟踪点一样。该查询还应该返回根本没有任何' 的 '。如果可能的话,我不喜欢使用's方法来做到这一点。tp1.datatp1createdItemTrackingPointQuerySetextra

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

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

有任何想法吗?

4

2 回答 2

7

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

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

您必须单独查询没有 TrackingPoints 的项目。

于 2011-03-06T12:37:53.077 回答
1

这不是直接回答您的问题,但如果不需要您所描述的确切内容,您可能会对每个组的最大 n 解决方案感兴趣。你可以看看我对类似问题的回答:

从不同类别获取最新对象的 Django 查询

- 这应该直接适用于您的情况:

 items = Item.objects.annotate(tracking_point_created=Max('trackingpoint__created')) 
 trackingpoints = TrackingPoint.objects.filter(created__in=[b.tracking_point_created for b in items])

请注意,如果created日期在 TrackingPoint 模型中重复,第二行可能会产生模棱两可的结果。

于 2010-05-15T07:36:18.653 回答