我正在尝试向用户查询集添加字段“等级”。我有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)
一个好问题。根据您的问题和代码,问题可能来自将未保存的对象从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
解析为您的模板。