使用最大值过滤数据

时间:2015-05-07 07:51:21

标签: python django django-models django-queryset

我的模型由订单字段组成,我想获取具有order最大值的那一行。

Class MyModel(models.Model):
   user = models.ForeignKey(User)
   order = models.IntegerField()

现在假设我要为用户1获取记录,对于此用户,表中存在的行总数为10,但我只想要具有最大订单值的行。

此外,如果我想为两个用户提取记录,则必须应用相同的条件。对于此过滤器,查询必须为每个具有order col。

的最大值的用户返回一行

对,我正在使用注释,但它返回所有行

rows = MyModel.objects.annotate(max_seq=Max('order')).filter(user = 1)

所以当我遍历这些行时,它会打印所有10行,但它必须只返回一行col col order order

3 个答案:

答案 0 :(得分:2)

您可以将用户(您希望过滤其中的记录)放入列表中,然后通过它们进行迭代并触发查询stellasia建议的内容。

hypot

即使用户列表中只有一个用户,它也会提供您想要的结果。

答案 1 :(得分:1)

尝试使用order_by并仅使用第一个返回的元素:

rows = MyModel.objects.filter(user = 1).order_by("orders")[0]

以下评论,此解决方案无法为所有用户获取最大值。我会以相反的方式做到这一点,从用户模型开始:

users = User.objects.annotate(Max("mymodel__order"))
print users[0].mymodel__order__max

另见this part of the django doc

答案 2 :(得分:0)

我只使用Django ORM解决了你的问题。

示例数据:

MyModel.objects.values('user__id', 'order')
[{'user__id': 1, 'order': 1}, {'user__id': 1, 'order': 2}, {'user__id': 2, 'order': 1}, {'user__id': 2, 'order': 2}, {'user__id': 2, 'order': 3}]

和查询:

MyModel.objects.values("user").annotate(ordermax=Max("order")).order_by()
[{'ordermax': 2, 'user': 1}, {'ordermax': 3, 'user': 2}]

Django doc参考:Interaction with default ordering or order_by()