从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 (将#修改为@)