相关疑难解决方法(0)

Django REST框架:序列化程序上下文如何工作?

Django REST Framework中的一个非常标准的任务是提供附加args/ kwargs序列化程序,以设置不通过设置的字段值request.data,但通过url参数或cookie中的值.例如,我需要将user我的Comment模型的字段设置为等于request.userPOST请求.这些额外的参数称为上下文.

几个问题(1,2 StackOverflow上)认为我重写get_serializer_context()我的方法ModelViewSet.我做了,但没有帮助.我试图理解,出了什么问题,并发现我从源代码中无法理解,这个上下文系统应该如何工作.(关于此事的文件也缺失了)

任何人都可以解释,序列化程序在正常请求数据中添加上下文?我发现了两个地方,它从上下文中保存了值.

  1. serializer.save(),方法,它将kwargs与验证数据混合,但通常不带参数调用(例如,通过ModelMixins).
  2. 领域.__new__(),它缓存args和kwargs,但似乎以后没有人读过它们.

django-rest-framework

12
推荐指数
1
解决办法
1万
查看次数

在Django Rest Framework中动态修改序列化程序字段

我正在尝试使用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)

python django rest frameworks django-rest-framework

6
推荐指数
1
解决办法
1万
查看次数

将 url 参数传递给序列化程序

假设我的网址是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)

python django django-rest-framework

6
推荐指数
1
解决办法
4991
查看次数

Django 1.8在Serializer中获得了kwargs

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

python django django-rest-framework

5
推荐指数
2
解决办法
1873
查看次数

标签 统计

django-rest-framework ×4

django ×3

python ×3

frameworks ×1

rest ×1