将额外的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的答案 – 考虑在你的视图中使用GenericAPIView
的get_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): .....
希望这有助于人们寻找这个。