【问题标题】:Django 1.8 getting kwargs in SerializerDjango 1.8 在 Serializer 中获得 kwargs
【发布时间】:2015-12-24 22:46:53
【问题描述】:

这对我来说似乎有点奇怪,但现在有效。由于我是 django/python 的新手,请告诉我您将如何解决问题。 目标是创建一个 Waypoint 对象,该对象在路径中具有 Trip id 作为参数。 Trip 是 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)

【问题讨论】:

  • 你为什么要这样做?您的序列化程序中有一个 trip 字段,因此它将位于验证数据中。
  • 端点类似于“/trips/5545/waypoint/”而且我不想额外发送行程对象
  • 当然不是 id,因为路径已经包含它。我想在正文中发送的唯一内容是位置和时间(插入对象时将生成 id)

标签: python django django-rest-framework


【解决方案1】:

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

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)

【讨论】:

    【解决方案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)
    

    【讨论】:

    猜你喜欢
    • 2020-04-02
    • 2021-11-16
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2015-06-26
    • 2016-02-21
    相关资源
    最近更新 更多