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