You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用distinct('data_agent')触发ProgrammingError的问题求助

Django获取唯一QuerySet的问题解决

问题原因

你遇到的ProgrammingError是PostgreSQL的DISTINCT ON语法限制导致的:该语法要求DISTINCT ON指定的字段必须完全匹配ORDER BY子句的初始字段。而你的Data_agent_account模型在Meta中设置了默认排序ordering = ['date_entered', ],这会干扰查询时的排序逻辑,即使你显式指定order_by('data_agent'),最终生成的SQL排序可能包含额外字段,触发语法错误。

解决方案

方案1:强制覆盖默认排序,匹配DISTINCT ON要求

先清除模型的默认排序,再指定以data_agent为排序首字段,确保和DISTINCT ON的字段完全匹配:

da_list = Data_agent_account.objects.filter(paid_on__isnull=True).order_by().order_by('data_agent').distinct('data_agent')

如果需要对每个data_agent下的记录再排序(比如取最新的一条),可以追加排序字段:

da_list = Data_agent_account.objects.filter(paid_on__isnull=True).order_by().order_by('data_agent', '-date_entered').distinct('data_agent')

方案2:直接获取唯一的data_agent ID(对应你手动编写的SQL)

如果只需要不重复的关联ID,不需要完整模型实例,用values_list结合distinct()实现,和你手动写的SQL逻辑一致:

da_ids = Data_agent_account.objects.filter(paid_on__isnull=True).values_list('data_agent_id', flat=True).distinct()

返回的是一个包含所有唯一data_agent_id的列表。

方案3:获取唯一关联对象的完整字段信息

如果需要每个唯一data_agent对应的具体字段(包括关联模型的字段),可以用values指定字段后再distinct:

# 替换data_agent__name为你需要的Data_agent模型字段
da_list = Data_agent_account.objects.filter(paid_on__isnull=True).values('data_agent_id', 'data_agent__name').distinct()

返回的是字典格式的唯一结果集合。

内容的提问来源于stack exchange,提问作者John Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:04:54