Django Rest Framework 创建用户自定义序列化允许相同的电子邮件

Fra*_*eit 0 python authentication django django-rest-framework

我正在尝试使用 rest 框架创建用户,但我可以使用相同的电子邮件创建多个用户,我如何验证已接收的电子邮件?

这是我的序列化程序代码:

from django.contrib.auth.models import User
from django.contrib.auth import get_user_model

class UserSerializer(serializers.ModelSerializer):
    invoices = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    password = serializers.CharField(write_only=True)

    def create(self, validated_data):
        user = get_user_model().objects.create(
            email=validated_data['email'],
            username=validated_data['username']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

    class Meta:
        model = User
        write_only_fields = 'password'
        read_only_fields = 'id'
        fields = ('id',
                  'username',
                  'email',
                  'password',
                  'invoices',
                  )
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Fra*_*eit 5

好的,进一步阅读REST FRAMEWORK 文档,有“唯一字段”验证器,通过添加它,它可以完美运行。

email = serializers.EmailField(validators=[UniqueValidator(queryset=User.objects.all())])
Run Code Online (Sandbox Code Playgroud)

所以它看起来像这样

class UserSerializer(serializers.ModelSerializer):
invoices = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
password = serializers.CharField(write_only=True)
email = serializers.EmailField(validators=[UniqueValidator(queryset=User.objects.all())])

def create(self, validated_data):
    user = get_user_model().objects.create(
        email=validated_data['email'],
        username=validated_data['username']
    )
    user.set_password(validated_data['password'])
    user.save()
    return user

class Meta:
    model = User
    write_only_fields = 'password'
    read_only_fields = 'id'
    fields = ('id',
              'username',
              'email',
              'password',
              'invoices',
              )
Run Code Online (Sandbox Code Playgroud)

感谢您的支持!