prefetch_related不适用于django REST框架序列化程序中的SerializerMethodField

时间:2018-05-17 02:46:42

标签: 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

这是我改变的序列化程序,它不起作用:

# 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

1 个答案:

答案 0 :(得分:4)

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

def get_queryset(self):
    queryset = Model.objects.preftech_related("related_field")
    return queryset

,此查询集将已经有您的相关字段。您无需在序列化器中编写自定义逻辑。