本文介绍 django.db.models.query.QuerySet.distinct 的用法。
声明
distinct(*fields)
返回在其 SQL 查询中使用 SELECT DISTINCT 的新 QuerySet。这消除了查询结果中的重复行。
默认情况下,QuerySet 不会消除重复行。实际上,这很少会成为问题,因为像 Blog.objects.all() 这样的简单查询不会引入重复结果行的可能性。但是,如果您的查询跨越多个表,则在评估 QuerySet 时可能会得到重复的结果。那时你会使用 distinct() 。
注意
调用中使用的任何字段都包含在 SQL order_by() SELECT 列中。当与 distinct() 结合使用时,这有时会导致意外结果。如果您按相关模型中的字段排序,这些字段将添加到选定的列中,否则它们可能会使重复的行看起来不同。由于额外的列不会出现在返回的结果中(它们只是为了支持排序),因此有时看起来返回的结果不明确。
同样,如果您使用 查询来限制选定的列,则任何values() (或默认模型排序)中使用的列仍将涉及并可能影响结果的唯一性。order_by()
这里的寓意是,如果您使用distinct(),请注意按相关模型排序。同样,当同时使用distinct() 和 时,按不在values() 调用中的字段排序时要小心。values()
仅在 PostgreSQL 上,您可以传递位置参数 ( *fields ) 以指定应应用 DISTINCT 的字段名称。这将转换为 SELECT DISTINCT ON SQL 查询。这就是区别。对于正常的distinct() 调用,数据库在确定哪些行不同时比较每一行中的each 字段。对于具有指定字段名称的distinct() 调用,数据库将仅比较指定的字段名称。
注意
指定字段名称时,must 在 QuerySet 中提供 order_by(),并且 order_by() 中的字段必须以 distinct() 中的字段开头,顺序相同。
例如,SELECT DISTINCT ON (a) 为您提供 a 列中每个值的第一行。如果你不指定一个顺序,你会得到一些任意的行。
示例(第一个之后的仅适用于 PostgreSQL):
>>> Author.objects.distinct()
[...]
>>> Entry.objects.order_by('pub_date').distinct('pub_date')
[...]
>>> Entry.objects.order_by('blog').distinct('blog')
[...]
>>> Entry.objects.order_by('author', 'pub_date').distinct('author', 'pub_date')
[...]
>>> Entry.objects.order_by('blog__name', 'mod_date').distinct('blog__name', 'mod_date')
[...]
>>> Entry.objects.order_by('author', 'pub_date').distinct('author')
[...]
注意
请记住, 使用已定义的任何默认相关模型排序。您可能必须按关系 order_by() _id 或引用字段显式排序,以确保 DISTINCT ON 表达式与 ORDER BY 子句开头的表达式匹配。例如,如果 Blog 模型通过 name 定义了 :ordering
Entry.objects.order_by('blog').distinct('blog')
…不起作用,因为查询将按 blog__name 排序,因此与 DISTINCT ON 表达式不匹配。您必须按关系 _id 字段(在本例中为 blog_id)或引用的字段(blog__pk)显式排序,以确保两个表达式匹配。
相关用法
- Python Django QuerySet.difference用法及代码示例
- Python Django QuerySet.dates用法及代码示例
- Python Django QuerySet.defer用法及代码示例
- Python Django QuerySet.delete用法及代码示例
- Python Django QuerySet.select_related用法及代码示例
- Python Django QuerySet.union用法及代码示例
- Python Django QuerySet.latest用法及代码示例
- Python Django QuerySet.values用法及代码示例
- Python Django QuerySet.intersection用法及代码示例
- Python Django QuerySet.get用法及代码示例
- Python Django QuerySet.none用法及代码示例
- Python Django QuerySet.exclude用法及代码示例
- Python Django QuerySet.get_or_create用法及代码示例
- Python Django QuerySet.update_or_create用法及代码示例
- Python Django QuerySet.prefetch_related用法及代码示例
- Python Django QuerySet.first用法及代码示例
- Python Django QuerySet.annotate用法及代码示例
- Python Django QuerySet.values_list用法及代码示例
- Python Django QuerySet.select_for_update用法及代码示例
- Python Django QuerySet.order_by用法及代码示例
- Python Django QuerySet.bulk_update用法及代码示例
- Python Django QuerySet.in_bulk用法及代码示例
- Python Django QuerySet.aggregate用法及代码示例
- Python Django QuerySet.reverse用法及代码示例
- Python Django QuerySet.count用法及代码示例
注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.query.QuerySet.distinct。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
