【问题标题】:Set default serializer for user in django [duplicate]在 django 中为用户设置默认序列化程序 [重复]
【发布时间】:2021-04-24 22:45:58
【问题描述】:

我在 django 中创建了一个用于注册的 rest-framework API,它的序列化器是这样的:

class SignupSerializer(ModelSerializer):

class Meta:
    model = User
    fields = ('email', 'password', 'first_name', 'last_name')
    read_only_fields = ()

def create(self, validated_data):
    with transaction.atomic():
       new_user = User.objects.create_user(....)
       return new_user

现在它工作得很好,但是problem is that it also returns password hash 在响应对象中。 或者,如果我在任何其他序列化程序中包含user 并设置depth=1,它仍会返回包括password 在内的每个字段

如何为用户设置默认序列化程序?让它只返回我自己设置的那些字段?

【问题讨论】:

    标签: django django-rest-framework django-serializer django-users


    【解决方案1】:

    Django Rest Framework 字段可以配置为“只写”。该文档甚至有一个几乎涵盖了您的用例的示例:

    class CreateUserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ['email', 'username', 'password']
            extra_kwargs = {'password': {'write_only': True}}
    
        def create(self, validated_data):
            user = User(
                email=validated_data['email'],
                username=validated_data['username']
            )
            user.set_password(validated_data['password'])
            user.save()
            return user
    

    https://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments

    【讨论】:

    • 细则:“如果该字段已在序列化程序类上显式声明,则 extra_kwargs 选项将被忽略。”
    【解决方案2】:

    尝试使用不同的序列化器,比如一个用于创建(发布),另一个用于读取(获取)。

    在获取序列化程序中,排除密码字段。

    【讨论】:

      猜你喜欢
      • 2021-03-27
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2021-11-22
      • 2021-03-22
      相关资源
      最近更新 更多