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)
并且此查询集已包含您的相关字段。您不必在序列化程序中编写自定义逻辑。
| 归档时间: |
|
| 查看次数: |
1040 次 |
| 最近记录: |