使用最大值过滤数据
Filter data using max value
我有一个由订单字段组成的模型,我想获取具有 order
.
最大值的行
Class MyModel(models.Model):
user = models.ForeignKey(User)
order = models.IntegerField()
现在假设我想为用户 1 获取记录,对于这个用户,table 中存在的总行数是 10
,但我只想要具有最大订单价值的那一行。
此外,如果我想为两个用户获取记录,则必须应用相同的条件。对于此过滤器查询,每个用户必须 return 一行,最大值为 order
col.
没错,我正在使用注释,但它 return 所有行
rows = MyModel.objects.annotate(max_seq=Max('order')).filter(user = 1)
所以当我遍历这一行时它会打印所有 10 行,但它必须 return 只有一行具有 col max order value
尝试使用 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
您可以将用户(您想要过滤记录的用户)放入列表中,然后遍历它们并根据 stellasia 的建议触发查询..
users = [1,2,3]
for user in users:
row = MyModel.objects.filter(user__id = user).order_by("order")[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 文档参考:Interaction with default ordering or order_by()
我有一个由订单字段组成的模型,我想获取具有 order
.
Class MyModel(models.Model):
user = models.ForeignKey(User)
order = models.IntegerField()
现在假设我想为用户 1 获取记录,对于这个用户,table 中存在的总行数是 10
,但我只想要具有最大订单价值的那一行。
此外,如果我想为两个用户获取记录,则必须应用相同的条件。对于此过滤器查询,每个用户必须 return 一行,最大值为 order
col.
没错,我正在使用注释,但它 return 所有行
rows = MyModel.objects.annotate(max_seq=Max('order')).filter(user = 1)
所以当我遍历这一行时它会打印所有 10 行,但它必须 return 只有一行具有 col max order value
尝试使用 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
您可以将用户(您想要过滤记录的用户)放入列表中,然后遍历它们并根据 stellasia 的建议触发查询..
users = [1,2,3]
for user in users:
row = MyModel.objects.filter(user__id = user).order_by("order")[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 文档参考:Interaction with default ordering or order_by()