Django REST Framework中的一个非常标准的任务是提供附加args/ kwargs序列化程序,以设置不通过设置的字段值request.data,但通过url参数或cookie中的值.例如,我需要将user我的Comment模型的字段设置为等于request.userPOST请求.这些额外的参数称为上下文.
几个问题(1,2 StackOverflow上)认为我重写get_serializer_context()我的方法ModelViewSet.我做了,但没有帮助.我试图理解,出了什么问题,并发现我从源代码中无法理解,这个上下文系统应该如何工作.(关于此事的文件也缺失了)
任何人都可以解释,序列化程序在正常请求数据中添加上下文?我发现了两个地方,它从上下文中保存了值.
__new__(),它缓存args和kwargs,但似乎以后没有人读过它们.我正在尝试使用django rest框架文档中描述的高级序列化程序用法.http://django-rest-framework.org/api-guide/serializers.html#advanced-serializer-usage动态修改序列化器字段
这是我的序列化程序类:
class MovieSerializer(serializers.ModelSerializer):
moviework_work = MovieWorkSerializer(many=True)
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
dropfields = kwargs.pop('dropfields', None)
# Instantiate the superclass normally
super(MovieSerializer, self).__init__(*args, **kwargs)
if dropfields:
# Drop fields specified in the `fields` argument.
banished = set(dropfields)
for field_name in banished:
self.fields.pop(field_name)
class Meta:
model = Movie
fields = ('field1','field2','moviework_work')
Run Code Online (Sandbox Code Playgroud)
这是我的观点
class MovieFromInterpreterViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer(dropfields=('moviework_work',))
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
TypeError: 'MovieSerializer' object is not callable
Run Code Online (Sandbox Code Playgroud) 假设我的网址是POST:/api/v1/my-app/my-model/?myVariable=foo
如何将 传递myVariable给序列化程序?
# serializer.py
class MySerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = MyModel
def custom_validator(self):
# how can i get the "myVariable" value here?
pass
def validate(self, attrs):
attrs = super().validate(attrs)
self.custom_validator()
return attrs
# views.py
class MyViewset(ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MySerializer
Run Code Online (Sandbox Code Playgroud) 这对我来说有点奇怪,但现在有效.由于我是django/python中的新手,请告诉我你将如何解决这个问题.目标是创建一个Waypoint对象,其中Trip ID作为路径中的参数.旅行是Waypoint的外键.
class WaypointSerializer(serializers.ModelSerializer):
trip = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Waypoint
fields = ('id', 'trip', 'position', 'time')
def create(self, validated_data):
trip_id = self.context.get('request').parser_context['kwargs']['pk']
validated_data['trip'] = Trip.objects.get(pk=trip_id)
return super(WaypointSerializer, self).create(validated_data)
Run Code Online (Sandbox Code Playgroud)