姜戈初学者。如何更新所有对象并将某个字段设置为另一个字段的函数值?
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()
【讨论】:
以上是关于姜戈初学者。如何更新所有对象并将某个字段设置为另一个字段的函数值?的主要内容,如果未能解决你的问题,请参考以下文章