2016-03-13 24 views
0

我想创建用户与其余框架,但我可以创建多个相同的电子邮件,我如何验证电子邮件?Django 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', 
       ) 

提前感谢!

回答

4

好吧,进一步阅读的REST FRAMEWORK documentation,有“独特的领域”的验证,加入这个,它完美的作品。

email = serializers.EmailField(validators=[UniqueValidator(queryset=User.objects.all())]) 

因此,它看起来像这样

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', 
      ) 

感谢您的支持!

-1

复制并粘贴此代码。它的工作..

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) 

    class Meta: 
     model = User 
     write_only_fields = 'password' 
     read_only_fields = 'id' 
     fields = ('id', 
        'username', 
        'email', 
        'password', 
        'invoices', 
       ) 

     def create(self, validated_data): 
     user = User.objects.filter(email=validated_data['email']) 
     if user: 
      raise serializers.ValidationError("The email '" + 
               validated_data['email'] + 
               "' already exists") 
     else: 
      return User.objects.create_user(**validated_data) 

在代码中唯一的变化是

def create(self, validated_data): 
    user = User.objects.filter(email=validated_data['email']) 
    if user: 
     raise serializers.ValidationError("The email '" + 
              validated_data['email'] + 
              "' already exists") 
    else: 
     return User.objects.create_user(**validated_data) 

在这个函数中,我得到使用电子邮件的用户的详细信息。如果用户退出并出现错误显示“电子邮件[email protected]已经退出 或者如果用户不存在,则创建用户

相关问题