Django rest framework: как сделать представление для удаления нескольких объектов?

Я создаю простое приложение Фото-Альбомы с использованием Django Rest Framework (DRF). Я хотел бы иметь возможность удалять несколько альбомов одновременно, предоставляя массив идентификаторов. Я использую viewsets.ModelViewSet для основных представлений.

class AlbumViewSet(viewsets.ModelViewSet):
    queryset = Album.objects.all()
    serializer_class = AlbumSerializer

Мне удалось создать представление для показа альбомов перед операцией удаления, добавив эту функцию в мой views.py файл.

@api_view(['GET', 'DELETE'])
def delete_albums(request):
    """
        GET:    list all albums
        DELETE: delete multiple albums
    """

    if request.method == 'GET':
        albums = Album.objects.all()
        serializer = AlbumSerializer(albums, many=True)
        return Response(serializer.data)

    elif request.method == 'DELETE':
        ids = request.data
        albums = Album.objects.filter(id__in=ids)
        for album in albums:
            album.delete()
        serializer = AlbumSerializer(albums, many=True)
        return Response(serializer.data)

Если я запущу curl -X delete -H "Content-Type: application/json" http://localhost:8000/albums/delete -d '{"data":[1,2,3]}' , то он удалит альбомы с идентификаторами 1,2,3.

Это нормально, за исключением того, что:

  • Это не основано на классах, а я бы предпочел, чтобы все было основано на классах, если это возможно
  • Я бы предпочел иметь форму в представлении, которая позволяет мне ввести массив, например, [1,2,3], нажать кнопку удаления, а затем увидеть результаты запроса в браузере, подобно тому, как это делается при создании нового объекта через интерфейс.

Может ли кто-нибудь обрисовать, как этого добиться? Спасибо!

Вы можете использовать декоратор действия

from rest_framework.decorators import action
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.request import Request

#import your model and serializer classes

class AlbumViewSet(viewsets.ModelViewSet):
    queryset = Album.objects.all()
    serializer_class = AlbumSerializer

    @action(methods=["DELETE"], details =False, )
    def delete(self, request:Request):
        delete_id =request.data
        delete_albums = self.queryset.filter(id__in=delete_id)
        
        delete_albums.delete()
        return Response( self.serializer_class(delete_albums,many=True).data) 

Предполагая, что ваша точка modelViewSet api была /api/albums. теперь вы можете сделать запрос на удаление к /api/albums/delete

Вы можете ознакомиться с полным документом о наборах представлений на ViewSet. и о том, как использовать декоратор action, предоставляемый django rest framework

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