首页 > 解决方案 > 不能同时设置 `read_only` 和 `write_only`

问题描述

在我的项目中,我想将密码设置为read_only(因为我有一个单独的端点来重置密码)和write_only(因为我不希望在响应中发送密码)。

这是我的序列化程序:

class UserSerializer(serializers.ModelSerializer):
    """A Serizlier class for User """

    class Meta:
        model = models.User
        fields = ('id', 'email', 'phone_number', 'user_type', 'password')
        extra_kwargs = { 'password': { 'write_only': True} }
        read_only_fields = ('password',)

但我收到一条错误消息:

/api/user/21/ 处的 AssertionError

不能同时设置read_onlywrite_only

我怎样才能有一个字段既read_onlywrite_only

标签: djangodjango-rest-framework

解决方案


将序列化程序的方法覆盖__init__()为,

class UserSerializer(serializers.ModelSerializer):
    """A Serizlier class for User """

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.context['some_flag']:
            self.fields['password'].read_only = True
        else:
            self.fields['password'].write_only = True

    class Meta:
        model = models.User
        fields = ('id', 'email', 'phone_number', 'user_type', 'password')
        # extra_kwargs = { 'password': { 'write_only': True} } # remove this
        # read_only_fields = ('password',) # remove this

some_flag变量是您应该从密码重置视图或其他视图传递给序列化程序的东西


推荐阅读