3
votes

guys! I have this serializer class for the user model

class UserSerializer(serializers.ModelSerializer):
    username = serializers.RegexField("^(?=.{6,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$")
    full_name = serializers.RegexField("^([a-zA-Z]{2,}\s[a-zA-Z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)")
    email = serializers.EmailField()
    phone = serializers.RegexField("^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$")

    class Meta:
        model = User
        fields = ['username', 'full_name', 'email', 'password', 'phone']

This is my serializer class for the moment. I want to validate that the username and email does not exist before saving an user. Can I do it without manually writing the validations? And I also need to validate the regex for the username and the email field for the email

Thank you!

2
You need to write field-level validator methodsJPG

2 Answers

1
votes

You can validate fields by using validate_{fieldname}:

class UserSerializer(serializers.ModelSerializer):
    username = serializers.RegexField("^(?=.{6,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$")
    full_name = serializers.RegexField("^([a-zA-Z]{2,}\s[a-zA-Z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)")
    email = serializers.EmailField()
    phone = serializers.RegexField("^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$")

    class Meta:
        model = User
        fields = ['username', 'full_name', 'email', 'password', 'phone']


    def validate_username(self, value):
        if User.objects.filter(username=value).exists():
            raise serializers.ValidationError("A user with this username already exists!")
        return value

    def validate_email(self, value):
        if User.objects.filter(email=value).exists():
            raise serializers.ValidationError("A user with this email already exists!")
        return value

Note that I would personally use these methods to check the input against a regex (with re module) and use CharField for the username field and EmailField for the email.

0
votes

You can use RegexValidator in your model

class User(models.Model):
    username = models.CharField(max_length=128, unique=True, validators=[RegexValidator(regex="^(?=.{6,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$")])
    full_name = models.CharField(max_length=128, validators=[RegexValidator(regex="^([a-zA-Z]{2,}\s[a-zA-Z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)")])
    email = models.EmailField(max_length=128, unique=True)
    phone = models.CharField(max_length=128, unique=True, null=True, validators=[RegexValidator(regex="^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$")])
    ...

Your serializer

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'full_name', 'email', 'password', 'phone']