Django如何展示去重查询集 按dashboard_id去重后表格不显示值怎么解决
问题根因
你当前代码中values_list('dashboard_id', flat=True).distinct()返回的是仅包含dashboard_id值的一维序列,不是完整的Reports模型对象集合,所以模板中访问report.user、report.created_at等关联字段和属性时没有对应数据,自然无法正常渲染。
解决方案
方案1:PostgreSQL数据库专属写法(最简洁)
Django针对PostgreSQL数据库支持distinct()指定去重字段,可直接返回完整模型对象,模板无需修改即可正常渲染:
# views.py 修改后的代码 def reports_list(request): # 按dashboard_id去重,相同dashboard_id默认取created_at最早的一条,要保留最新的就把created_at改成-created_at report_list = Reports.objects.order_by('dashboard_id', 'created_at').distinct('dashboard_id') context = { 'report_list': report_list, } return render(request, "report_list.html", context)
方案2:全数据库兼容通用写法
如果使用的是MySQL、SQLite等不支持distinct指定字段的数据库,可以手动实现去重逻辑:
# views.py 修改后的代码 def reports_list(request): # 先拿到所有去重后的dashboard_id dash_ids = Reports.objects.values_list('dashboard_id', flat=True).distinct() report_list = [] for dash_id in dash_ids: # 每个dashboard_id取对应的一条记录,可通过调整order_by规则选择要保留的条目 report = Reports.objects.filter(dashboard_id=dash_id).order_by('-created_at').first() if report: report_list.append(report) context = { 'report_list': report_list, } return render(request, "report_list.html", context)
内容的提问来源于stack exchange,提问作者edche
相关产品推荐
相关产品推荐

