【问题标题】:Filter data using max value使用最大值过滤数据
【发布时间】:2015-05-07 07:51:21
【问题描述】:

我有一个包含订单字段的模型,我想获取具有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 最大顺序值的行

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    您可以将用户(您想要过滤其记录)放在列表​​中,然后遍历它们并触发查询 stellasia 建议的内容..

    users = [1,2,3]
    
    for user in users:
       row = MyModel.objects.filter(user__id = user).order_by("order")[0]
    

    即使用户列表中只有一个用户,它也会给出您想要的结果..

    【讨论】:

    • 我已经在遍历数组了,但是我的逻辑出了点问题,所以这就是为什么它不能工作,无论如何感谢你的帮助
    【解决方案2】:

    尝试使用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

    【讨论】:

    • 但是使用限制不会对多个用户失败,如果我要为一个以上的用户获取数据,那么它将只返回一行并且只返回一个用户,我想要所有的行用户但具有最大订单价值
    • 是的,你是对的,我的错,我跳过了这部分问题:(
    【解决方案3】:

    我只使用 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()

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多