Обновление набора запросов при просмотре без фактического обновления базы данных - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь добавить поле "оценка" в мой набор запросов пользователей. У меня есть 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)

1 Ответ

0 голосов
/ 26 марта 2019

Хороший вопрос.Судя по вашим вопросам и кодам, проблема, вероятно, связана с анализом несохраненного объекта с view до template.

Краткий ответ - использовать dictionary вместо анализа несохраненного object.

user_obj = Users.object.get(pk=x)
calculated_grade = subject.calculate_user_grade(user_obj)
user_dict = dict(user_obj)
user_dict.setdefault('grade', calculated_grade)

. Затем выполните синтаксический анализ user_dict для вашего шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...