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
相关产品推荐
相关产品推荐

