代码之家  ›  专栏  ›  技术社区  ›  mpen

詹戈:分组?

  •  3
  • mpen  · 技术社区  · 14 年前

    我要找的东西如下:

    previous_invoices = Invoice.objects.filter(is_open=False)
                                       .order_by('-created')
                                       .group_by('user')
    

    但是 group_by() 不存在…

    这将找到每个用户最近关闭的发票。

    这个 aggregation API 似乎让你这样做的计数和金额,但我不需要计数或金额或任何东西,我真的要发票对象!

    2 回复  |  直到 7 年前
        1
  •  1
  •   John Moutafis Milani Igor    7 年前

    选项1:

    虽然A group_by() Django中不存在,您可以尝试使用 latest() 用户的方法和筛选器:

    previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
                                       .latest('created') 
    

    对于老版本的django来说 延迟() 不存在,查询将如下所示:

    previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
                                       .order_by('-created')[0]
    

    选项2:

    如果你真的想创造 group_by ,然后手动创建一个,如下面接受的答案所示: Django GROUP BY field value .

    1. 使用 .values_list() 具有 flat=True 获取数据库中现有值的列表(如果您事先不知道)。还用 .distinct() 为了消除重复的价值,因为我们不关心这些:

      value_list = MyModel.objects.values_list(
          'interesting_field', flat=True
      ).distinct()
      
    2. 现在遍历 value_list 填上你的字典:

      group_by_value = {}
      for value in value_list:
          group_by_value[value] = MyModel.objects.filter(interesting_field=value)
      

    现在 group_by_value 字典以键的形式包含不同的值 在你 interesting_field 作为queryset对象的值,每个 包含 MyModel 具有 interesting_field=a value from value_list .


    音符:

    存在此库 django-group-by 它声称添加了 组() 在Django你可能想查一下。

        2
  •  2
  •   Adriano Varoli Piazza    14 年前

    this page from 2007 谁把它黑客到了Django,但那将是没有意义的,因为1.1之前确实有一个未经记录的组织。但是 this thread from a year ago 似乎有些见识。基本上:

    Django故意不在 ORM。尽管事实上我们 通过关系存储后端 有时会泄漏,orm api 与sql无关。相反,我们 暴露特定的 碰巧是 在 变成了sql(很可能是 由完全不同的 一套魔法精灵 不同的存储系统后端)。

    另请参见使用 extra ,以及 那个 可能失败。祝你好运。