是否可以使用GET参数更改序列化器深度?例如,调用http://localhost:8000/api-auth/?depth=1
发布于 2018-05-23 12:18:32
我以一种非常简单的方式解决了这个问题,假设视图是用基于类的视图或视图集生成的:
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发布于 2018-05-23 13:54:10
将一些额外数据从视图传递到序列化程序的正确方法是序列化程序上下文。
在基于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']https://stackoverflow.com/questions/50487145
复制相似问题