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

时间:2018-03-27 10:02:52

标签: django python-3.x django-rest-framework django-queryset

编辑: 我当然需要一个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()

1 个答案:

答案 0 :(得分:2)

尝试按以下方式添加/更新序列化程序,

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()