Python Django,按一个字段分组,只取每个组的最新/max,然后取回ORM对象

Python Django,按一个字段分组,只取每个组的最新/max,然后取回ORM对象,python,django,django-models,orm,Python,Django,Django Models,Orm,我有以下Django(3.0)ORM模型: class Portfolio(models.Model): code = models.CharField(max_length=20) name = models.CharField(max_length=100) date = models.DateField() created = models.DateTimeField(blank=True, null=True, auto_now_add=True) 我想

我有以下Django(3.0)ORM模型:

class Portfolio(models.Model):
    code = models.CharField(max_length=20)
    name = models.CharField(max_length=100)
    date = models.DateField()
    created = models.DateTimeField(blank=True, null=True, auto_now_add=True)
我想按
code
字段对它们进行分组,对于每个代码,只取具有最大
date

我知道我可以使用以下查询:

Portfolio.objects.values('code').annotate(latest=Max('date'))
但它有三个问题:

  • 它只给我
    code
    latest
    字段,因此我丢失了其他字段
  • 它会返回一个字典,而我需要一个实际
    Portfolio
    对象的列表
  • Max
    之所以有效,是因为
    date
    是一个
    DateField
    。它也适用于其他数字字段类型,但是如果我想按照CharField的值(字典顺序)对记录进行排序,例如
    name
    ,并为每个组获取第一条记录,该怎么办
  • 因此,总而言之,我的问题是:如何使用Django ORM检索由一个或多个字段分组的ORM对象列表,并且只返回给定任意“order by”子句的每个组的第一条记录?从组中获取第一个/最后一个值正是ORDER BYSQL子句中的DISTINCT ON(但afaik仅在Postgresql中。在MySQL中,仅
    DISTINCT
    ,不
    ON
    ,因此-(直接),SQLite也不支持
    DISTINCT ON
    ,仅在Postgresql中传递)

    在Django中,我们可以使用QuerySet这样做:

    Portfolio.objects.order_by().order_by(
        'code', # first, cause we want to group by this value
        '-created' # descending order, latest / max will be first
    ).distinct('code')
    
    在这里,我们使用empty
    .order\u by()
    调用来清除QuerySet(已添加或默认)上已存在的所有排序,以确保只对next
    .order\u by(…)
    应用所需的排序,以便正确分组


    一般使用方法:

    • 在应用筛选器的情况下启动QuerySet-
      q=SomeModel.objects.filter(col1\uu gt=2)

    • 清除已在QuerySet上设置的排序-
      q.order\u by()

    • 首先使用分组列添加排序(在
      distinct
      之后使用),并在-
      q.order\u by('col1'、'-col2'、'-col3'、'-date1')之后添加其他列。

      在这里:

      • “col1”、“col2”、“col3”-是我们希望
        分组的列/字段
        (用于分组)

      • 'col1'、'-col2'、'-col3'-我们想要分组的列是相同的,但我们想要按顺序分组(对于所有子组(组列表中除第一列以外的所有列)至关重要,对于这些子组,它将影响从组中获取的结果行-“第一列”或“最后一列”;对于第一列,它将不影响结果行,仅影响结果排序)

      • “-date1”-我们选择的任何其他排序列,以对最终组行进行排序
    • 最后添加
      .distinct()
      子句,其中包含我们选择作为参数分组的字段,顺序与
      .order\u by()
      子句-
      q.distinct('col1','col2','col3')中的顺序相同。

    从组中获取第一个/最后一个值正是通过ORDER BY
    SQL子句进行区分的方法(但afaik仅在Postgresql中使用。在MySQL中,仅
    区分
    ,不
    打开
    ,因此-(直接),SQLite也不支持
    DISTINCT ON
    ,只支持
    DISTINCT
    。为了表示这一点,在Django中只能在Postgresql中传递)

    在Django中,我们可以使用QuerySet这样做:

    Portfolio.objects.order_by().order_by(
        'code', # first, cause we want to group by this value
        '-created' # descending order, latest / max will be first
    ).distinct('code')
    
    在这里,我们使用empty
    .order\u by()
    调用来清除QuerySet(已添加或默认)上已存在的所有排序,以确保只对next
    .order\u by(…)
    应用所需的排序,以便正确分组


    一般使用方法:

    • 在应用筛选器的情况下启动QuerySet-
      q=SomeModel.objects.filter(col1\uu gt=2)

    • 清除已在QuerySet上设置的排序-
      q.order\u by()

    • 首先使用分组列添加排序(在
      distinct
      之后使用),并在-
      q.order\u by('col1'、'-col2'、'-col3'、'-date1')之后添加其他列。

      在这里:

      • “col1”、“col2”、“col3”-是我们希望
        分组的列/字段
        (用于分组)

      • 'col1'、'-col2'、'-col3'-我们想要分组的列是相同的,但我们想要按顺序分组(对于所有子组(组列表中除第一列以外的所有列)至关重要,对于这些子组,它将影响从组中获取的结果行-“第一列”或“最后一列”;对于第一列,它将不影响结果行,仅影响结果排序)

      • “-date1”-我们选择的任何其他排序列,以对最终组行进行排序
    • 最后添加
      .distinct()
      子句,其中包含我们选择作为参数分组的字段,顺序与
      .order\u by()
      子句-
      q.distinct('col1','col2','col3')中的顺序相同。


    尝试使用SQLite后端上的
    DISTINCT将触发后端引发
    NotSupportedError
    。尝试使用SQLite后端上的
    DISTINCT将触发后端引发
    NotSupportedError