在视图上更新查询集而不实际更新数据库

问题描述 投票:1回答:1

我正在尝试向用户查询集添加字段“等级”。我有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)

python django django-queryset django-orm
1个回答
0
投票

一个好问题。根据您的问题和代码,问题可能来自将未保存的对象从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解析为您的模板。

© www.soinside.com 2019 - 2024. All rights reserved.