Django 1.8在Serializer中获得了kwargs

and*_*dre 5 python django django-rest-framework

这对我来说有点奇怪,但现在有效.由于我是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)

M.V*_*oid 5

在视图中,您可以覆盖 get_serializer_context 方法:

def get_serializer_context(self):
    return {"trip_id": self.kwargs['trip_id']}
Run Code Online (Sandbox Code Playgroud)

然后在序列化程序中,您可以从 self.context 获取它:

def create(self, validated_data):
    trip_id = self.context["trip_id"]
    validated_data['trip'] = Trip.objects.get(pk=trip_id)
    return super(WaypointSerializer, self).create(validated_data)
Run Code Online (Sandbox Code Playgroud)


YPC*_*ble 5

一种无需修改视图的简单方法是通过序列化程序的上下文访问视图:

def create(self, validated_data):
    trip_id = self.context.get('view').kwargs.get('trip_id')
    if trip_id is None:
        raise serializers.ValidationError("Must set the trip_id kwarg to use this serializer.")
    validated_data['trip'] = Trip.objects.get(pk=trip_id)
    return super(WaypointSerializer, self).create(validated_data)
Run Code Online (Sandbox Code Playgroud)