将请求上下文从Django Rest Framework中的Viewset传递给序列化程序 [英] Pass request context to serializer from Viewset in Django Rest Framework

查看:384
本文介绍了将请求上下文从Django Rest Framework中的Viewset传递给序列化程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的情况,一个序列化器字段的值取决于当前登录的用户的身份。我已经看到如何在初始化序列化程序时将用户添加到上下文中,但是当使用ViewSet时,我不知道如何执行此操作,因为您只提供序列化器类而不是实际的串行器实例。



基本上我想知道如何从:

  class myModelViewSet(ModelViewSet): 
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer

to:

  class myModelSerializer(serializers.ModelSerializer):
uploaded_by = serializers。 SerializerMethodField()
special_field = serializers.SerializerMethodField()

class Meta:
model = myModel

def get_special_field(self,obj):
if self.context ['request']。user.has_perm('something.add_something'):
return something

对不起,如果没有从DOC中清除:
添加额外上下文
哪个说要做

  serializer = AccountSerializer(account,context = {'request':request})
serializer.data

但我不知道如何从视图自动执行,因为我只能改变serializer类,而不是Serializer实例本身。

解决方案

GenericViewSet 具有可以覆盖的 get_serializer_context 方法:

 类myModelViewSet(ModelViewSet):
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer

def get_serializer_context(self):
return {'request':self.request}


I have a case where the values for a serializer field depend on the identity of the currently logged in user. I have seen how to add the user to the context when initializing a serializer, but I am not sure how to do this when using a ViewSet, as you only supply the serializer class and not the actual serializer instance.

Basically I would like to know how to go from:

class myModelViewSet(ModelViewSet):
   queryset = myModel.objects.all()
   permission_classes = [DjangoModelPermissions]
   serializer_class = myModelSerializer

to:

class myModelSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.SerializerMethodField()
    special_field = serializers.SerializerMethodField()

    class Meta:
        model = myModel

    def get_special_field(self, obj):
        if self.context['request'].user.has_perm('something.add_something'):
           return something

Sorry if it wasn't clear, from the DOCs: Adding Extra Context Which says to do

serializer = AccountSerializer(account, context={'request': request})
serializer.data

But I am not sure how to do that automatically from the viewset, as I only can change the serializer class, and not the serializer instance itself.

解决方案

GenericViewSet has the get_serializer_context method you can override:

class myModelViewSet(ModelViewSet):
    queryset = myModel.objects.all()
    permission_classes = [DjangoModelPermissions]
    serializer_class = myModelSerializer

    def get_serializer_context(self):
        return {'request': self.request}

这篇关于将请求上下文从Django Rest Framework中的Viewset传递给序列化程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆