问题描述
我是django和django-rest-framework的新手,我遇到了一个需要优化API端点的项目。发现SerializerMethodField()导致对sql的重复查询,我认为这是N + 1问题。我目前正在阅读并尝试探索annotate(),但发现逻辑计算很复杂,因此我坚持如何将其转换为annotate()。是否有人对如何正确实施这一想法有想法?请参见下面的代码。希望任何人都可以指导我,因为我已经在此问题上停留了几天。非常感谢。
serializer.py:
class BootcampClassstatisticsSerializer(ModelBaseSerializer): attendance_rating = serializers.SerializerMethodField() def get_attendance_rating(self,instance): attendance_rating = None attendance_count = 0 present_count = 0 bootcampers = instance.bootcamper_set.all() date = self.context.get('date') for bootcamper in bootcampers: attendances = bootcamper.dailyattendance_set.all() if date: attendances = attendances.filter(date=date) present_attendances = attendances.filter(status=constants.PRESENT) if instance.class_type == constants.DAY: attendance_count += len(attendances) * 2 for item in present_attendances: if item.duration == 'wd': present_count += 2 if item.duration == 'hd': present_count += 1 if instance.class_type == constants.NIGHT: attendance_count += len(attendances) present_count += len(present_attendances) if attendance_count: attendance_rating = round(present_count / attendance_count * 100,2) return attendance_rating class Meta: model = BootcampClass fields = ( 'id','batch_number','start_date','end_date','class_type','attendance_rating'
@H_502_7@views.py:
class BootcampClassstatisticslist(APIView): queryset = BootcampClass.objects.all() serializer = BootcampClassstatisticsSerializer() return Response(serializer,status=status.HTTP_200_OK)
@H_502_7@解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)