Vit*_*ler 3 django orm django-models
如何在Django中注释查询集,以添加其他字段来表示排序结果中每一行的索引(位置)?
我需要以有序方式检索用户,并添加一个字段,该字段将指定订单中每个对象的绝对位置。
那是我的代码:
users = User.objects.all().annotate(total_points=Sum('score_earnings', distinct=True)).order_by('-total_points')
users = users.annotate(place, /* how to get an index of each ordered? */)
Run Code Online (Sandbox Code Playgroud)
这是相关的分数模型:
class Score(models.Model):
user = models.ForeignKey('users.CustomUser', related_name='score_earnings', on_delete=models.CASCADE)
points = models.DecimalField(max_digits=8, decimal_places=1)
Run Code Online (Sandbox Code Playgroud)
因此,此place字段应表示结果中每一行的索引:1、2、3,...
稍后,我将不得不从结果中选择一个范围,并期望获得place字段的绝对值:
users[3:6]
Run Code Online (Sandbox Code Playgroud)
预期结果:
[{
"total_points": 100.0,
"place": 3
}, {
"total_points": 70.0,
"place": 4
}, {
"total_points": 50.0,
"place": 5
}]
Run Code Online (Sandbox Code Playgroud)
我正在使用MySQL DB。
------------更新------------
我能够在SQL中执行类似的操作:
set @row_num = 0;
SELECT name, @row_num := @row_num + 1 as row_index
FROM Users
Run Code Online (Sandbox Code Playgroud)
但这仍然不是我真正需要的,因为如果我添加LIMIT语句,则row_index值将在新结果内...
几个月前我做了类似的工作。我当时postgres用作数据库和django 2.0。我不确定以下代码是否可以解决您的问题。但是我想分享我能解决问题的代码部分。
from django.db.models import Window, F
from django.db.models.functions import DenseRank
ranklist = Score.objects.annotate(
place=Window(
expression=DenseRank(),
order_by=[
F('points').desc(),
]))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
257 次 |
| 最近记录: |