Создание нескольких объектов одновременно Django Rest Framework Generic Views

Я использую Django Rest Framework. Я пытаюсь создать listcreateapiview для создания нескольких объектов одновременно, но ничего из найденного мной до сих пор не работает, и я не уверен почему.

#My view
class MyListCreateView(ListCreateAPIView):
    serializer_class = MySerializer

    def get_queryset(self):
        return Mymodel.objects.filter(user=self.request.user.id)

    # tried this with no luck
    def get_serializer(self, instance=None, data=None, many=False, partial=False):
        if data is not None:
            data.is_valid(raise_exception=True)
            return super(MyListCreateView, self).get_serializer(instance=instance, data=data, many=True, partial=partial)
        else:
            return super(MyListCreateView, self).get_serializer(instance=instance, many=True, partial=partial)

    def perform_create(self, serializer):
        user_obj = self.request.user
        serializer.save(user=user_obj)

#my serializer
class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'```

Начнем с самого начала:

  • Это обычный View с динамическим many аргументом. Аргумент many сам по себе не заставляет ваш сериализатор создавать несколько объектов одновременно. Чтобы many работал так, как ожидается, нам нужно ListSerializer.

     class MyView(ListCreateAPIView):
         ...
         def create(self, request, *args, **kwargs):
             data = request.data
             serializer = MySerializer(data=data, many=isinstance(data, list))
             serializer.is_valid(raise_exception=True)
             serializer.save()
    
  • Создайте ListSerializer с помощью функции create следующим образом:

     class MyListSerializer(serializers.ListSerializer):
         ...
         def create(self, validated_data):
             items = [MyModel(**item) for item in validated_data]
             return MyModel.objects.bulk_create(items)
    
  • И, наконец, в классе вашего главного сериализатора Meta установите значение поля list_serializer_class в MyListSerializer.

     class MySerializer(serializers.Serializer):
         ...
         def create(self, validated_data):
             return MyModel.objects.create(**validated_data)
    
         class Meta:
             list_serializer_class = MyListSerializer
    

Почитать о поведении пользовательского сериализатора можно здесь: https://www.django-rest-framework.org/api-guide/serializers/#customizing-listserializer-behavior

Вернуться на верх