如何解决从SerializerMethodField更改为annotate
我是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'
views.py:
class BootcampClassStatisticsList(APIView):
queryset = BootcampClass.objects.all()
serializer = BootcampClassStatisticsSerializer()
return Response(serializer,status=status.HTTP_200_OK)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。