Ein Memo über die Anforderungsmethoden-Steuermethode beim Erstellen einer API mit dem Django-Rest-Framework
Mac 10.15.5 Python 3.8.1 Django 3.0.7 djangorestframework 3.11.0
Ich habe auf den Code in diesem Artikel verwiesen
Die Berechtigung der Anforderungsmethode wird von der Basisklasse gesteuert, die von der in views.py definierten Klasse geerbt wird. Der viewsets.ModelViewSet-Teil des folgenden Codes. Es wird vom importierten rest_framework vorbereitet.
blog/views.py
import django_filters
from rest_framework import viewsets
from rest_framework import filters
from .models import User
from .models import Entry
from .serializer import UserSerializer
from .serializer import EntrySerializer
class UserViewSet(viewsets.ModelViewSet): # <-Dies
queryset = User.objects.all()
serializer_class = UserSerializer
class EntryViewSet(viewsets.ModelViewSet): # <-Dies
queryset = Entry.objects.all()
serializer_class = EntrySerializer
filter_fields = ('author', 'status')
Es wird in einer Datei namens viewssets.py in rest_framework definiert. Wenn Sie von ModelViewSet erben, können Sie GET, POST, PUT und DELETE verwenden. Wenn Sie die geerbte Klasse in ReadOnlyModelViewSet ändern, können Sie nur GET steuern.
rest_framework/viewsets.py
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
rest_framework/viewsets.py
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `list()` and `retrieve()` actions.
"""
pass
Bei Verwendung von PUT oder DELETE muss bis zum Primärschlüssel angegeben werden.
/api/users/
-> /api/users/1/
Nicht gut
$ curl -X PUT -d name=yamada -d [email protected] localhost:8000/api/users/
OK
$ curl -X PUT -d name=yamada -d [email protected] localhost:8000/api/users/1/
Dies liegt daran, dass das DjangoRestFramework wissen muss, welche Objekte aktualisiert / gelöscht werden müssen.
Es kann in der Listenansicht nicht erkannt werden (/ api / users /
).
Ich denke, Sie werden einen solchen Fehler bekommen.
{"detail":"Method \"DELETE\" not allowed."}
{"detail":"Methode\"DELETE\"Ist nicht erlaubt."}
https://www.django-rest-framework.org/api-guide/viewsets/
https://stackoverflow.com/questions/26711975/django-drf-405-method-not-allowed-on-delete-operation/26714561#26714561
Recommended Posts