Python 如何在Django中构建允许任意查询和切片的排行榜?

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

我在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} 这将生成一个带有排名的可分页表格:

    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