问题描述
我是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 (将#修改为@)