自动增加排名字段在我的响应在Django Rest框架



我有一个StudentAnswer模型,它存储学生(User)在测验中给出的答案id。如果答案正确,则1分,否则为0分。模型是这样的:

class StudentAnswer(models.Model):
user = models.ForeignKey(User, related_name='user_question_answer', 
on_delete=models.SET_NULL,null=True, blank=True)
answer = models.ForeignKey(QuizQuestionAnswer, related_name='user_answer', 
on_delete=models.CASCADE)
quiz = models.ForeingKey(Quiz, on_delete=models.CASCADE)
marks = models.IntegerField()

现在我需要我的响应看起来像这样:{"rank" 1、用户";约翰·杜"marks" 10},{"rank" 2"user"Stanley"marks" 8}

我的模型中没有rank字段。我想在我的回答中排名,这也是根据学生的分数(从高到低)。我该怎么做呢?

做到这一点的绝对最简单的方法是使用order_by('marks'),然后在您的视图或模板中,当您遍历每个User时,它们的排名只是循环的索引。两个例子:

# template
{% for student in students %}
# rank is {{ forloop0.counter }}
{% endfor %}
# views
for index, value in enumerate(students):
# rank is index
...

如果你想显式地添加排序到查询集,那么你可以使用注释,看看这个问题的答案:Django模型-如何添加排序索引注释?

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(),
]))