5

I already know that drf has an interface to add a validator to obejct, I have a view that can create multiple Param objects with one request, I want to verify if there are two or more objects whose name and value fields are the same, How can I validate the list of object in serializer?

models.py

class Param(models.Model):
    name = models.CharField(max_length=256)
    value = models.CharField(max_length=256)

    class Meta:
        unique_together = ('name', 'value')

serializers.py

class ParamSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.ParamKey
        fields = ['name', 'value']
        extra_kwargs = {
            'id': {
                'required': False,
            },
            'name': {
                'required': False,
            }
        }

views.py

class ParamViewSet(viewsets.ViewSet):

    def create(self, request):

        serializer = serializer.ParamKeySerializer(
            data=request.data, many=True)
        if serializer.is_valid():
            return Response()
        return Response()
2

2 Answers 2

9

You could use ListSerializer for this kind of functionality.

The ListSerializer class provides the behavior for serializing and validating multiple objects at once. You won't typically need to use ListSerializer directly, but should instead simply pass many=True when instantiating a serializer.

For reference visit https://www.django-rest-framework.org/api-guide/serializers/#listserializer

class ParamListSerializer(serializers.ListSerializer):
    def validate(self, attrs):
        # Here attrs contains list of Params You can validate it here
        pass

    def create(self, validated_data):
        books = [Book(**item) for item in validated_data]
        return Book.objects.bulk_create(books)

class ParamSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.ParamKey
        fields = ['name', 'value']
        list_serializer_class = ParamListSerializer  # This specifies which list serializer class to user
        extra_kwargs = {
            'id': {
                'required': False,
            },
            'name': {
                'required': False,
            }
        }

    def validate(self, attrs):
        # enter your validations here
        pass
Sign up to request clarification or add additional context in comments.

Comments

0

Try to do like this, may be it will help

class ParamSerializer(serializers. ModelSerializer):
    class Meta:
        model = Param
        fields = ['name', 'value']
        extra_kwargs = {
            'id': {
                'required': False,
            },
            'name': {
                'required': False,
            }
        }

    def validate(self, attrs):
        # your validatator code here

    def create(self, validated_data):
       paramkeys = validated_data.pop('your_list')
       for p in paramkeys:
           param, _ = Param.objects.get_or_create(name=p.name, value=p.value)

1 Comment

Can this way validate a list of object?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.