Je sais déjà que drf a une interface pour ajouter un validateur à obejct, j'ai une vue qui peut créer plusieurs objets Param avec une seule demande, je veux vérifier s'il y a deux ou plusieurs objets dont name et {{X1 }} les champs sont les mêmes, comment puis-je valider la liste des objets dans le sérialiseur?

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()
1
Rhys Pang 15 mars 2019 à 07:10

2 réponses

Meilleure réponse

Vous pouvez utiliser ListSerializer pour ce type de fonctionnalité.

La classe ListSerializer fournit le comportement pour sérialiser et valider plusieurs objets à la fois. En règle générale, vous n'aurez pas besoin d'utiliser ListSerializer directement, mais vous devrez simplement passer many=True lors de l'instanciation d'un sérialiseur.

Pour référence, visitez 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
2
Devang Padhiyar 15 mars 2019 à 04:32

Essayez de faire comme ça, peut-être que cela vous aidera

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)

0
Bakhtiyar Bekbergen 15 mars 2019 à 04:19