Django Rest Framework creates custom serialization of the user allows same email

advertisements

I'm trying to create users with the rest framework, but i can create more than one with the same email, how do i validate email taken?

this is my serializer code:

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

Thanks in advance!


Ok, further reading on the REST FRAMEWORK documentation , there is the "unique field" validator, by adding this, it works perfectly.

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

So it would look like this

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

Thanks for the support!