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

Top comments (0)