Python Django,按一个字段分组,只取每个组的最新/max,然后取回ORM对象
我有以下Django(3.0)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) 我想
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
,并为每个组获取第一条记录,该怎么办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”-我们选择的任何其他排序列,以对最终组行进行排序
- “col1”、“col2”、“col3”-是我们希望
- 最后添加
子句,其中包含我们选择作为参数分组的字段,顺序与.distinct()
子句-.order\u by()
q.distinct('col1','col2','col3')中的顺序相同。
区分,不打开,因此-(直接),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
。