姜戈初学者。如何更新所有对象并将某个字段设置为另一个字段的函数值?

Posted

技术标签:

【中文标题】姜戈初学者。如何更新所有对象并将某个字段设置为另一个字段的函数值?【英文标题】:Django Beginner. How do I update all objects and set a certain field to a value that is a function of another field? 【发布时间】:2018-09-05 16:31:27 【问题描述】:

编辑: 我在课程中需要一个 student_count 字段,因为我应该将此模型用于 REST API。如果你能告诉我如何在序列化程序中添加字段而不添加到模型中,我也会接受。

这是我的模型:

class Course(models.Model):
    student_count = models.PositiveIntegerField(default=0)
    students = models.ManyToManyField()

我尝试做的是以下,但它不起作用。

Course.objects.update(student_count=F('students__count'))

以下可行,但并不理想

courses = Course.objects.all()
        for course in courses:
            course.student_count = course.students.count()
            course.save()
        return Course.objects.all()

【问题讨论】:

您确定需要这样做吗?您可能应该在显示课程时计算学生人数,而不是将其作为单独的字段存储在模型中。 当你想在代码中计数时,只需从模型中删除 student_count 并从 course.students.count() 中获取学生数 我在课程中需要一个 student_count 字段,因为我应该将此模型用于 REST API。如果你能告诉我如何在序列化程序中添加字段而不添加到模型中,我也会接受。 【参考方案1】:

尝试如下添加/更新您的序列化程序,

from django.db.models import Count

class CourseSerializer(serializers.ModelSerializer):
    count = serializers.SerializerMethodField(read_only=True)

    def get_count(self, model):
        return model.students.aggregate(count=Count('id'))['count']


    class Meta:
        model = Course
        fields = ('count',)

您可以使用聚合 Count() 方法而不是 queryset.count() 它更快。阅读这篇 SO 帖子,aggregate(Count()) vs queryset.count()

【讨论】:

以上是关于姜戈初学者。如何更新所有对象并将某个字段设置为另一个字段的函数值?的主要内容,如果未能解决你的问题,请参考以下文章

db2如何实现用一张表的某个字段更新另一张表的相应字段。

Mysql如果某个字段值存在则更新另一个字段的值为原值+100,命令应该如何写?

SQL中如何遍历表并更新某个字段的值

怎么将一个表的字段更新为另一个表的值

SQLSERVER如何在数据库里根据某个字段,查出该表名字

SQL如何批量更新某列中一个字符为另一个字符