python - 更新 View 上的查询集而不实际更新数据库

标签 python django django-queryset django-orm

我正在尝试将字段“grade”添加到我的用户查询集中。我有 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传递给模板。但一旦到达那里,我修改的成绩字段就已经消失了。我在 View 上打印“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)

最佳答案

问得好。从您的问题和代码来看,问题可能在于将未保存的对象从 View 解析为模板

简短的答案是使用字典而不是解析未保存的对象

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 解析到您的模板。

关于python - 更新 View 上的查询集而不实际更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55346492/

相关文章:

python - 确定语法错误来自哪个文件

django - 基于缺乏反向关系以 Python 方式过滤 Django 查询集

python - 使用 Wagtail CMS 使用 Python 检测父页面和子页面类型

python - 请解释 tkinter 全局导入方法的基本原理

Django查询集排除值

Python 2 如何将 values_list 操作返回的 unicode 列表更改为字符串列表

python - 创建时如何使Django模型运行某些功能

python - TensorFlow v2 替换 clip_gradients_by_norm

python - Django API 传递类/字段名称,而不是与其关联的值

python - 类型错误 : __init__() takes at most 2 arguments (4 given)