predetch_related在Django REST框架序列化器中不适用于SerializerMethodField

roo*_*oob 5 django django-rest-framework

我有一个具有嵌套序列化器字段的序列化器。我已经设置了热切的加载,并且一切都很好。

但是,我确实向嵌套字段添加了一些自定义过滤,这需要一个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
Run Code Online (Sandbox Code Playgroud)

这是我更改的序列化器不起作用:

# 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
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以在来自视图的实际查询集中执行此操作,而不是在序列化程序中执行预取请求。您可以get_queryset使用自定义查询覆盖方法。不确定您的实际查询是什么,但例如,您可以执行以下操作:

def get_queryset(self):
    queryset = Model.objects.preftech_related("related_field")
    return queryset
Run Code Online (Sandbox Code Playgroud)

并且此查询集已包含您的相关字段。您不必在序列化程序中编写自定义逻辑。