par*_*ier 3 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')
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的许多部分中,我需要检索一组Item并使用data字段TrackingPoint排序的每个项目中的最新字段来注释每个项目created.例如,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)
Run Code Online (Sandbox Code Playgroud)
我需要一个查询来检索i1带有tp1.data字段值注释的实例,这tp1是按created字段排序的最新跟踪点.那个查询也应该返回Item没有任何问题TrackingPoint的查询.如果可能的话我不喜欢使用QuerySet的extra方法来做到这一点.
这就是我到目前为止所尝试的......并且失败了:(
Item.objects.annotate(max_created=Max('trackingpoint__created'),
data=Avg('trackingpoint__data')).filter(trackingpoint__created=F('max_created'))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
小智 7
这是一个提供(TrackingPoint,Item)对的单个查询:
TrackingPoint.objects.annotate(max=Max('item__trackingpoint__created')).filter(max=F('created')).select_related('item').order_by('created')
Run Code Online (Sandbox Code Playgroud)
您必须分别查询没有TrackingPoints的项目.
这并不是直接回答您的问题,但如果不需要您所描述的内容,您可能会对每组最大 n 解决方案感兴趣。你可以看看我在类似问题下的回答:
-- 这应该直接适用于您的案例:
items = Item.objects.annotate(tracking_point_created=Max('trackingpoint__created'))
trackingpoints = TrackingPoint.objects.filter(created__in=[b.tracking_point_created for b in items])
Run Code Online (Sandbox Code Playgroud)
created请注意,如果日期在 TrackingPoint 模型中重复,第二行可能会产生不明确的结果。