更新视图上的查询集,而无需实际更新数据库

时间:2019-03-25 21:13:48

标签: python django django-queryset django-orm

我正在尝试向用户的查询集添加字段“等级”。我有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,即“注释”的初始值。

我使用的模型是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 :(得分: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解析为您的模板。