gpt4 book ai didi

django - prefetch_lated 不适用于 django REST 框架序列化器中的 SerializerMethodField

转载 作者:行者123 更新时间:2023-12-02 06:30:59 25 4
gpt4 key购买 nike

我有一个具有嵌套序列化器字段的序列化器。我已经设置了急切加载,一切都运行良好。

但是,我必须向嵌套字段添加一些自定义过滤,这需要 SerializerMethodField。

此更改之后,与 prefetch_相关的预加载不再起作用。如何使用 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

最佳答案

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

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

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

关于django - prefetch_lated 不适用于 django REST 框架序列化器中的 SerializerMethodField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com