Django 1.8在Serializer中获得了kwargs

时间:2015-09-27 16:47:57

标签: 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)

2 个答案:

答案 0 :(得分:3)

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

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)

答案 1 :(得分:2)

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

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

然后在序列化程序中,你可以从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)