Как переопределить метод POST для массового добавления - Django Rest Framework

Я пишу REST API с использованием Django Rest Framework, и я хотел бы, чтобы один из моих маршрутов принимал массовое добавление метода POST для создания нескольких объектов. Другие методы (GET, PUT, PATCH, DELETE) останутся прежними, принимая только по одному.

То, что у меня есть, находится ниже, и в настоящее время он отлично работает для публикации по одному.

В моем urls.py:

path('book', books.BookViewSet.as_view()),

books.py:

class BookViewSet(viewsets.ModelViewSet):
    serializer_class = BookSerializer
    queryset = Book.objects.all()
    permission_classes = (IsAuthenticated, )

serializer.py:

class BookSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        # I assume this is the method to be overridden to get this

    class Meta:
        model = Book
        fields = ('id', 'name', 'author_id', 'page_number', 'active')

person Luc    schedule 20.05.2020    source источник


Ответы (1)


Метод создания сериализатора, к сожалению, создает объект данных по объекту. Вы можете переопределить метод создания ModelViewSet и после проверки использовать метод bulk_create.

def create(self, request, *args, **kwargs):
    many = True if isinstance(request.data, list) else False
    serializer = BookSerializer(data=request.data, many=many)
    serializer.is_valid(raise_exception=True)
    author = request.user # you can change here
    book_list = [Book(**data, author=author) for data in serializer.validated_data]
    Book.objects.bulk_create(book_list)
    return Response({}, status=status.HTTP_201_CREATED)
person kamilyrb    schedule 20.05.2020
comment
Просто имейте в виду, что bulk_create не запускает сигналы (pre_save, post_save). Кроме того, data = serializer.is_valid(raise_exception=True) выполнит проверку и добавит правильное сообщение об ошибке с вложенностью. - person Andrew Backer; 21.05.2020
comment
Это действительно кажется лучшим решением, но что, если в моем сериализаторе мне нужно создать объект, а author_id - это пользователь, выполняющий запрос POST? Я знаю, что могу получить пользователя в методе create ModelViewSet, но как мне это сделать, чтобы мой сериализатор также знал пользователя при создании объекта? Спасибо - person Luc; 21.05.2020
comment
Вы можете передать своего автора в модель книги в Book(**data,author=...) части. Я обновил ответ - person kamilyrb; 21.05.2020