Как django остальные рамки проверяют список объектов? - PullRequest
1 голос
/ 15 марта 2019

Я уже знаю, что у drf есть интерфейс для добавления валидатора в obejct, у меня есть представление, которое может создать несколько объектов Param одним запросом, я хочу проверить, есть ли два или более объектов, чьи name и value поля одинаковы. Как проверить список объектов в сериализаторе?

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 ]

1 голос
/ 15 марта 2019

Вы можете использовать ListSerializer для такого рода функций.

Класс ListSerializer обеспечивает поведение для сериализации и проверки нескольких объектов одновременно. Обычно вам не нужно использовать ListSerializer напрямую, но вместо этого следует просто передать many=True при создании экземпляра сериализатора.

Для ознакомления посетите https://www.django -rest-framework.org / api-guide / serializer / # 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
0 голосов
/ 15 марта 2019

Попробуйте сделать так, может быть, это поможет

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...