如何在序列化程序中提及密码字段?

Mah*_*iri 0 python django django-serializer django-rest-framework

我有一个用于身份验证的自定义用户,并想为其创建一个序列化程序类,我的自定义用户模型如下所示:

class User (AbstractUser):
        bio = models.TextField(max_length=500, blank=True)
        birth_date = models.DateField(null=True, blank=True)
        image=models.FileField(null=True , blank=True)
Run Code Online (Sandbox Code Playgroud)

而我的序列化器是:

class UserSerializer (serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username' ,'email' ,'password' ,'firstname' , 'last name' )
Run Code Online (Sandbox Code Playgroud)

我怎么能提到密码字段是密码,并且其内容必须被散列?

JPG*_*JPG 6

更改serializers.py如下

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = ('username', 'email', 'password', 'firstname', 'last name')

    def create(self, validated_data):
        user = super().create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    def update(self, instance, validated_data):
        user = super().update(instance, validated_data)
        try:
            user.set_password(validated_data['password'])
            user.save()
        except KeyError:
            pass
        return user
Run Code Online (Sandbox Code Playgroud)


Hoa*_*ell 6

散列密码,请致电:

make_password(origin_password)
Run Code Online (Sandbox Code Playgroud)

示例serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password


class UserSerializer(serializers.HyperlinkedModelSerializer):

    password = serializers.CharField(
        write_only=True,
        required=True,
        help_text='Leave empty if no change needed',
        style={'input_type': 'password', 'placeholder': 'Password'}
    )

    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'password')

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data.get('password'))
        return super(UserSerializer, self).create(validated_data)
Run Code Online (Sandbox Code Playgroud)