DRF:使用GET参数传递序列化程序深度

时间:2018-05-23 11:23:26

标签: python django django-rest-framework

可以使用GET参数更改序列化程序深度吗?例如,调用http://localhost:8000/api-auth/?depth=1

2 个答案:

答案 0 :(得分:1)

将一些额外数据从视图传递到序列化程序的正确方法是序列化程序上下文

在DRF基于类的视图中,您可以(实际上应该为此目的)覆盖get_serializer_context()方法。在重写的方法中,您只需添加到上下文,这只是一个字典,无论您想要什么。

简单的例子,如何在视图中执行此操作:

class YourView(generics.RetrieveAPIView):

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context['depth'] = self.request.query_params.get('depth', 1)
        return context

要在序列化程序中访问它:

class YourSerializer(serializers.ModelSerializer):    
    the_depth_from_get_param = serializers.SerializerMethodField()

    class Meta:
        model = YourModel
        fields = [
            'the_depth_from_get_param'
        ]

    def get_the_depth_from_get_param(self, obj):
        return self.context['depth']

答案 1 :(得分:-1)

我以一种非常简单的方式解决了这个问题,假设视图是基于类的视图或视图集进行的:

serializer_class它实际上是 序列化程序,它是一个类,因此您可以使用serializer_class.Meta.depth访问深度值,并指定它是self.request.GET数组

中的值

示例序列化器:

class ItemSerializer(ModelSerializer):
    class Meta:
        model = Item
        fields = '__all__'

示例视图:

class ItemList(generics.ListCreateAPIView):
    queryset = Item.objects.all()
    serializer_class = serializers.ItemSerializer

    def get_serializer_class(self):
      if(self.request.GET.get('depth')):
          if (10 >= int(self.request.GET.get('depth')) >= 0):
              self.serializer_class.Meta.depth = int(
                  self.request.GET.get('depth'))
      return self.serializer_class