首页 > 解决方案 > 如何使用 django 过滤器“选择不同的 on”作为子查询

问题描述

我正在为我的 django 项目创建一个搜索功能,并且想知道如何在按玩家得分的数量对行进行排序的同时对行进行分组。

我希望能够对它们进行分组,当它找到具有相同名称的值时,它只取第一个值

我在 postgresql 上找到的解决方案

select * from 
(select distinct on (name) * from database_manager_player) t
order by pts desc;

数据库值:

姓名 团队
安德鲁 一个 20
安德鲁 24
安德鲁 C 12
琼斯 8
琼斯 C 6

查询后的预期结果:

姓名 团队
安德鲁 一个 20
琼斯 8

我想知道是否有办法在 django 中编写类似的代码。

在views.py中:

    def get_queryset(self):
            qs = Player.objects.all().order_by('-pts')
            sort_by = self.request.GET.get("sort")
            if sort_by is not None and sort_by != str(0)
                sort_by = "-" + sort_by 
                # query here 

使用 'qs' 我怎么能在 if 语句中做一些事情,以便它与 postgresql 中的一样。

标签: pythonsqldjangopostgresqlfilter

解决方案


要选择 distinct on,您必须使用子查询

 ids = qs.distinct("name").order_by().values_list("pk", flat=True)
 qs = qs.filter(pk__in=ids)

推荐阅读