我有一个具有嵌套序列化程序字段的序列化程序。我设置了急切的装载,一切都很好。
但是,我确实在嵌套字段中添加了一些自定义过滤,这需要一个SerializerMethodField。
更改后,prefetch_related切换加载不再有效。如何使用SerializerMethodField优化序列化程序?
这是我最初的工作设置:
# views.py
class MyView(generics.ListAPIView):
serializer_class = WorkingSerializer
def get_queryset(self):
queryset = MyModel.objects.all()
queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset
# serializers.py
class WorkingSerializer(serializers.ModelSerializer):
related_field_name = CustomSerializer(many=True)
@staticmethod
def setup_eager_loading(queryset):
queryset = queryset.prefetch_related('related_field_name')
return queryset
这是我改变的序列化程序,它不起作用:
# serializers.py
class NotWorkingSerializer(serializers.ModelSerializer):
related_field_name = serializers.SerializerMethodField('get_related_field')
def get_related_field(self, instance):
queryset = instance.related_field_name.all()
# some filtering done here
return queryset
@staticmethod
def setup_eager_loading(queryset):
queryset = queryset.prefetch_related('related_field_name')
return queryset
答案 0 :(得分:4)
您可以在来自View的实际查询集中执行此操作,而不是在序列化程序中执行预取请求。您可以使用自定义查询覆盖get_queryset
方法。不确定您的实际查询是什么,但是例如,您可以执行以下操作:
def get_queryset(self):
queryset = Model.objects.preftech_related("related_field")
return queryset
,此查询集将已经有您的相关字段。您无需在序列化器中编写自定义逻辑。