“使用原始sql从表”Django中选择DISTINCT field_name

问题描述 投票:1回答:2

如何在Django中运行SELECT DISTINCT field_name from table; SQL查询作为raw sql? 当我尝试使用Table.objects.raw("""SELECT DISTINCT field_name from table""")时,我得到了一个例外

InvalidQuery:原始查询必须包含主键

django django-orm
2个回答
2
投票

如果您不需要模型实例(如果您想要单个字段则无用),您也可以使用普通的db-api游标:

from django.db import connection
cursor = connection.cursor()
cursor.execute("select distinct field from table")
for row in cursor:
    print(row[0])

但是对于您的示例用例,您根本不需要SQL - orm也有valuesvalues_list查询集以及distinct()修饰符:

queryset = YourModel.objects.values_list("field", flat=True).order_by("field").distinct()
print(str(queryset.query))
# > 'SELECT DISTINCT `table`.`field` FROM `table` ORDER BY `table`.`title` ASC'
for title in queryset:
    print(title)

NB:

1 /因为我们想要单个字段,所以我使用flat=True参数来避免获得元组列表

2 /我明确地在字段上设置排序,否则最终在模型的meta中定义的默认排序可能会迫使排序字段成为te生成的查询的一部分。


0
投票

看起来你必须使用一些解决方法

select field_name, max(id)
from table_name
group by field_name;
© www.soinside.com 2019 - 2024. All rights reserved.