首页 文章

如何在django rest框架中指定为经过身份验证和未经身份验证的用户序列化哪些字段?

提问于
浏览
0

好的,我知道如何指定哪些字段(在序列化程序中)是read_only或只写这样:

class CustomUserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = CustomUser
        fields = ('url', 'username','email','password')
        write_only_fields = ('password',)

我知道权限类实现允许哪些http方法用于经过身份验证或未经过身份验证的用户请求 .

但是,如果我希望未经过身份验证的用户只能看到“用户名”,但经过身份验证/登录的用户也可以看到电子邮件呢? (例如)

有没有人知道如何以模块化方式编程这样的行为,所以它可以适用于多个模型/序列化?

2 回答

  • 1

    如果您使用 GenericAPIView 或其中的任何一个's subclasses (which is pretty common), you can simply override the serializer' s __init__ 仅保留选定的字段:

    class MySerializer(serializers.HyperlinkedModelSerializer):
        def __init__(self, *args, **kwargs):
            super(MySerializer, self).__init__(*args, **kwargs)
    
            # GenericAPIView has an access to request object 
            request = self.context['request']
            if request.user.is_anonymous():
                field = self.fields['username']
                self.fields = {'username': field}
    

    当然,如果您直接调用序列化程序,则需要pass the context yourself .

  • 1

    您最好的选择是拥有两个不同的序列化程序,一个用于经过身份验证的用户,另一个用于未经身份验证的用户 . 然后,您可以通过覆盖get_serializer_class来控制使用哪个序列化程序,以便为请求返回正确的序列化程序 .

    您可以使用方法中的 self.request 访问当前请求 .

    没有简单的模块化方法来执行此操作,因为在不使用单独的序列化程序的情况下确保传入和传出数据仍然安全非常复杂 .

相关问题