Django序列化器:如何访问SerializerMethodField生成的points计算绩点
问题解决:'CourseTake' object has no attribute 'points'
错误原因
points是通过SerializerMethodField生成的序列化临时字段,仅存在于序列化后的输出数据中,不属于CourseTake模型实例的固有属性,因此直接访问coursetake.points必然报错。
解决方案
方案1:直接复用get_points方法的结果
既然已经实现了get_points的分数计算逻辑,直接调用该方法获取值,转成整数后再计算乘积即可:
class CourseTakeSerializer(serializers.ModelSerializer): course = SimpleCourseSerializer() points = serializers.SerializerMethodField() grade_points = serializers.SerializerMethodField() class Meta: model = CourseTake fields = ['id','course', 'grade', 'points', 'grade_points'] def get_points(self, coursetake: CourseTake): if coursetake.grade >= 90: return '4' elif coursetake.grade >= 70: return '3' elif coursetake.grade >= 50: return '2' return '1' def get_grade_points(self, coursetake: CourseTake): # 调用get_points获取分数,转为整数后计算乘积 points = int(self.get_points(coursetake)) return coursetake.course.credit_hours * points
方案2:抽离核心计算逻辑(推荐)
将分数计算逻辑抽成私有辅助方法,让get_points和get_grade_points共同调用,避免重复代码,后续修改分数规则时只需改动一处:
class CourseTakeSerializer(serializers.ModelSerializer): course = SimpleCourseSerializer() points = serializers.SerializerMethodField() grade_points = serializers.SerializerMethodField() class Meta: model = CourseTake fields = ['id','course', 'grade', 'points', 'grade_points'] def _calculate_points(self, coursetake: CourseTake): # 直接返回整数,方便后续计算 if coursetake.grade >= 90: return 4 elif coursetake.grade >= 70: return 3 elif coursetake.grade >= 50: return 2 return 1 def get_points(self, coursetake: CourseTake): # 转为字符串以匹配原有序列化输出格式 return str(self._calculate_points(coursetake)) def get_grade_points(self, coursetake: CourseTake): points = self._calculate_points(coursetake) return coursetake.course.credit_hours * points
内容的提问来源于stack exchange,提问作者Alotab
相关产品推荐
相关产品推荐

