Python 如何在Django中构建允许任意查询和切片的排行榜?
我在Django 2中有一个基本的排行榜,如下所示: 从django.db导入模型 类别排行榜模型。模型: 用户名=型号。CharFieldmax_长度=200 分数=模型。正整数字段 类元: 索引=[models.Indexfields=[-score]] 定义自身: 返回self.username 我可以使用Django的内置窗口函数Rank和PercentRank生成此排行榜表格的排名: 从django.db.models导入F,窗口 从django.db.models.functions导入PercentRank,Rank 条目= 排行榜.objects.annotate 排名=窗口 表达式=等级, order_by=Fscore.desc, , 百分位=窗口 表达式=百分比等级, order_by=Fscore.desc, , printRank\tPercentile\tCore\t用户ID\t用户名称 对于条目中的条目: printf{entry.rank}\t{entry.percentile:.3f}\t{entry.score}\t{entry.id}\t{entry.username} 这将生成一个带有排名的可分页表格:Python 如何在Django中构建允许任意查询和切片的排行榜?,python,sql,django,window-functions,leaderboard,Python,Sql,Django,Window Functions,Leaderboard,我在Django 2中有一个基本的排行榜,如下所示: 从django.db导入模型 类别排行榜模型。模型: 用户名=型号。CharFieldmax_长度=200 分数=模型。正整数字段 类元: 索引=[models.Indexfields=[-score]] 定义自身: 返回self.username 我可以使用Django的内置窗口函数Rank和PercentRank生成此排行榜表格的排名: 从django.db.models导入F,窗口 从django.db.models.functions
Rank Percentile Score User ID User Name
1 0.000 1000 564 Eager Guard
2 0.001 999 302 Top Hawk
2 0.001 999 747 Eager Whistler
2 0.001 999 842 Extreme Legend
5 0.004 997 123 Witty Guard
5 0.004 997 201 Arctic Elephant
7 0.006 996 21 Speedy Bear
7 0.006 996 678 Agile Player
9 0.008 995 562 Fast Hawk
10 0.009 994 467 Loyal Legend
然而,我很难在排行榜中查询特定的用户ID并检索他们的排名和百分比。窗口功能的结果似乎只应用于当前查询集ie,仅限于用户ID的过滤器,而不是整个排行榜集:
条目=
Leadboard.objects.filterid=100.annotate
排名=窗口
表达式=等级,
order_by=Fscore.desc,
,
百分位=窗口
表达式=百分比等级,
order_by=Fscore.desc,
,
第一
此用户的正确排名应为:
Rank Percentile Score User ID User Name
135 0.134 876 100 Clear Star
因此,问题是:
1如何查询特定用户ID并在排行榜上获得正确的排名/百分比
2如何查询排行榜的某一部分?例如,给定用户ID=100,如何查询他们的条目和周围+/-5个条目?因此,如果他们在排行榜上排名135,如何查询他们周围的10个条目
Postgres是生产数据库,但如果可能的话,我希望它与RDBMS无关
感谢您的帮助!谢谢
编辑:
我已经设法回答了我的第一个问题:如何使用原始SQL API按用户ID查询特定排行榜条目:
单个\u条目\u SQL=
选择
身份证件
用户名,
分数
等级
百分位秩
从…起
选择
U0.id,
U0.username,
U0.0分,
按U0排序。分数描述为排名,
百分比排名超过订单的百分比。分数描述为百分比排名
从…起
选择
身份证件
用户名,
分数
来自排行榜
作为U0
哪里
id=%s
查询用户ID=100的排行榜条目
entry=leadboard.objects.rawSINGLE\u entry\u SQL[100][0]
现在,这将为单个条目生成正确的结果:
Rank Percentile Score User ID User Name
135 0.134 876 100 Clear Star
然而,我仍然很难在给定特定用户ID的情况下查询排行榜的某一部分
Rank Percentile Score User ID User Name
135 0.134 876 100 Clear Star