将额外的parameter passing给Django Rest Framework中的Serializer类

我想从Viewset传递一些参数给DRF Serializer类,所以我试过这个:

class OneZeroSerializer(rest_serializer.ModelSerializer): def __init__(self, *args, **kwargs): print args # show values that passed location = rest_serializer.SerializerMethodField('get_alternate_name') def get_alternate_name(self, obj): return '' class Meta: model = OneZero fields = ('id', 'location') 

查看

 class OneZeroViewSet(viewsets.ModelViewSet): serializer_class = OneZeroSerializer(realpart=1) #serializer_class = OneZeroSerializer queryset = OneZero.objects.all() 

基本上我想传递一些基于querystring从视图到Serializer类的值,然后这些将分配给字段。

这些字段不包含在模型中,实际上是dynamic创build的字段。

在这个问题stackoverflow相同的情况下,但我不明白的答案。

任何人都可以帮助我在这种情况下,或build议我更好的select。

“ModelSerializer”构造函数的“context”arg非常容易。

例如:

鉴于:

 my_objects = MyModelSerializer( input_collection, many=True, context={'user_id': request.user.id} ).data 

在序列化程序中:

 class MyModelSerializer(serializers.ModelSerializer): ... is_my_object = serializers.SerializerMethodField('_is_my_find') ... def _is_my_find(self, obj): user_id = self.context.get("user_id") if user_id: return user_id in obj.my_objects.values_list("user_id", flat=True) return False ... 

所以你可以使用“self.context”获得额外的参数。

参考

为了实现redcyb的答案 – 考虑在你的视图中使用GenericAPIViewget_serializer_context方法,如下所示:

 def get_serializer_context(self): return {'user': self.request.user.email} 

你需要在视图覆盖get_serializer_context方法是这样的:

 def get_serializer_context(self): return {"customer_id": self.kwargs['customer_id']} 

serializer任何地方你可以得到它:

 customer_id = self.context["customer_id"] 

我写的旧代码可能对筛选嵌套序列化器有帮助:

 class MySerializer(serializers.ModelSerializer): field3 = serializers.SerializerMethodField('get_filtered_data') def get_filtered_data(self, obj): param_value = self.context['request'].QUERY_PARAMS.get('Param_name', None) if param_value is not None: try: data = Other_model.objects.get(pk_field=obj, filter_field=param_value) except: return None serializer = OtherSerializer(data) return serializer.data else: print "Error stuff" class Meta: model = Model_name fields = ('filed1', 'field2', 'field3') 

如何重写get_serializer_class:

 class ViewName(generics.ListAPIView): def get_serializer_class(self): param_value = self.context['request'].QUERY_PARAMS.get('Param_name', None) if param_value is not None: return Serializer1 else: return Serializer2 def get_queryset(self): ..... 

希望这有助于人们寻找这个。