Автоматическое увеличение поля ранга в моем ответе в Django Rest Framework
У меня есть модель StudentAnswer, которая хранит идентификатор ответа, данный студентом (пользователем) в тесте. Если ответ правильный, то 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()
Теперь мне нужно, чтобы мой ответ выглядел примерно так: { "ранг": 1, "user": "John Doe", "marks": 10 }, { "ранг": 2, "user": "Stanley", "marks": 8 }
У меня нет поля ранга в моей модели. Мне нужен ранг в моем ответе, и тоже в соответствии с оценками студентов (от высшей до низшей). Как я могу это сделать?
Заранее спасибо!
Самый простой способ сделать это - использовать order_by('marks')
и затем в вашем представлении или шаблоне, когда вы перебираете каждого пользователя, его ранг будет просто индексом цикла. Два примера:
# 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(),
]))