Я пытаюсь добавить поле "оценка" в мой набор запросов пользователей. У меня есть 3 модели: пользователи, предмет и экзамен. Я не думаю, что есть способ рассчитать оценку пользователя по первоначальному запросу, как:
Users.objects.get(pk=x).annotate(grade=z)
потому что мне нужно вызвать метод модели субъекта для расчета общей оценки этого пользователя по предмету, а не только оценки за 1 экзамен (см. Метод ниже в описании моделей).
На мой взгляд, я сделал:
user_obj = Users.object.get(pk=x).annotate(grade=Value(0, IntegerField()))
calculated_grade = subject.calculate_user_grade(user_obj)
user_obj.grade = calculated_grade
А затем передал user_obj в шаблон. Но как только он попадет туда, поле оценки, которое я изменил, уже исчезло. Я печатаю «user_obj.grade» в представлении, и оно дает правильное значение, затем я печатаю его в шаблоне, и оно дает мне 0, начальное значение «annotate».
Модели, которые я использую, являются пользовательской моделью по умолчанию в django, а затем
class Subject(models.Model):
name = models.CharField()
def calculate_user_grade(self, user):
points = 0
exams = Exam.objects.filter(subject=self)
for exam in exams:
user_answer = ExamUser.objects.get(user=user, exam=exam)
points += user_answer.points
return points
class Exam(models.Model):
subject = models.ForeignKey(Subject)
question = models.CharField()
class ExamUser(models.Model):
exam = models.ForeignKey(Exam)
user = models.ForeignKey(User)
points = models.PositiveIntegerField(default=0)