Django通过对两个字段的查询来区分分组

Posted

技术标签:

【中文标题】Django通过对两个字段的查询来区分分组【英文标题】:Django distinct group by query on two fields 【发布时间】:2016-01-10 08:35:27 【问题描述】:

我有一个有 2 个字段的模型。

class MyModel:
   tcode = Charfield
   created_on = Date field
   #some more fields

现在这个模型可以有多个具有相同 tcode 的行,并且每行可以有不同的日期或相同的日期。

例如

tcode1, 1/2/2001
tcode2, 1/2/2001
tcode2, 2/2/2001
....etc.

我想过滤此模型上的查询,以便 tcode 和日期字段组合应该是唯一的。我怎样才能得到所有这些对象。

我正在尝试这样做

MyModel.objects.all().order_by('tcode').distinct('tcode', 'created_on')

现在您可能会问,如果两个字段中有两行具有相同的数据,我想要哪一行!对我来说没关系,任何行都可以正常工作。

【问题讨论】:

你用的是什么sql? distinct() 带有位置参数 (*fields) 仅适用于 PostgreSQL。试试MyModel.objects.all().order_by('tcode').distinct() 那么MyModel.objects.all().order_by('tcode').distinct('tcode', 'created_on')肯定不行。您是否尝试过在没有位置参数的情况下使用 distinct() 【参考方案1】:

我认为没有一个查询可以做到这一点,因为数据库中没有机制可以从重复项中随机选择一个。但是,如果您只关心这两个字段,您可以这样做:

MyModel.objects.order_by('tcode').values('tcode', 'created_on').distinct()

这不会为您提供完整的 MyModel 对象,而是包含 tcodecreated_on 的所有现有组合的字典列表。

【讨论】:

【参考方案2】:

今天我遇到了同样的问题。在 get_queryset 方法中的 Django admin 中,我需要在多个字段中进行不同的操作。我这样解决了这个问题:

from django.db.models import TextField
from django.db.models.functions import Concat
Mymodel.objects.filter(...).annotate(distinct_name=Concat('tcode', 'created_on', output_field=TextField())).order_by('distinct_name').distinct('distinct_name')

这个决定有助于返回带有记录 ID 的 QuerySet

【讨论】:

这适用于 PostgreSQL 但不适用于 mysql 数据库

以上是关于Django通过对两个字段的查询来区分分组的主要内容,如果未能解决你的问题,请参考以下文章

Django分组查询

Django_查询类型_关联查询_聚合查询_分组查询_更新_删除操作

django 中的聚合函数,分组函数,F 查询, Q查询

如何使用 Django 进行分组和聚合

Django 查询 - 是不是可以在数据库级别按公共字段对元素进行分组?

通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录