DEV Community

DoriDoro
DoriDoro

Posted on

DRF create validation in serializer

I will show two different validations, one with the validation of one attribute of the serializer and the second with the validation of different attributes.

validation of different attributes in validate():

# serializers.py

class ProjectCreateSerializer(serializers.ModelSerializer):

    class Meta:
        model = Project
        fields = [
            "id",
            "name",
            "description",
            "project_type",
        ]

    def validate(self, attrs):
        if (
            self.context["view"]
            .project.filter(name=attrs["name"], project_type=attrs["project_type"])
            .exists()
        ):
            raise serializers.ValidationError("Attention! This project exists already.")
        return attrs
Enter fullscreen mode Exit fullscreen mode

self.context["view"].project this project property/attribute is created in view (ProjectViewSet). With this syntax we can get the project property and filter for existing projects. If this combination of name and project_type is found, the ValidationError will be raised. Otherwise the project will be validated.

validation with one attributes in validate_user():

validate_user the user part is the name of the attribute from the serializer. If you have an attribute project the function name would be validate_project().

# serializers.py

class ContributorSerializer(serializers.ModelSerializer):

    # create attribute 'user', which is write_only because we just need to give a value
    user = serializers.IntegerField(write_only=True)

    class Meta:
        model = UserModel
        fields = ["id", "user"]

    def validate_user(self, value):
        user = UserModel.objects.filter(pk=value).first()

        if user is None:
            raise serializers.ValidationError("User does not exists!")

        if user.is_superuser:
            raise serializers.ValidationError(
                "Superusers cannot be added as contributors."
            )

        if self.context["view"].project.contributors.filter(pk=value).exists():
            raise serializers.ValidationError(
                "This user is already a contributor of this project."
            )

        return user
Enter fullscreen mode Exit fullscreen mode

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More