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

时间:2014-11-01 21:29:58

标签: django django-rest-framework

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

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

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

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

有没有人知道如何以模块化方式编程此类行为,因此它可能适用于多个模型/序列化?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

如果您正在使用GenericAPIView或其任何子类(这是非常常见的),您只需覆盖序列化程序的__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

相关问题