Un mémo sur la méthode de contrôle de la méthode de requête lors de la construction d'une API à l'aide de django-rest-framework
Mac 10.15.5 Python 3.8.1 Django 3.0.7 djangorestframework 3.11.0
J'ai fait référence au code dans cet article
L'autorisation de la méthode de requête est contrôlée par la classe de base héritée par la classe définie dans views.py. Les vuesets.ModelViewSet font partie du code ci-dessous. Il est préparé par le rest_framework importé.
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): # <-cette
queryset = User.objects.all()
serializer_class = UserSerializer
class EntryViewSet(viewsets.ModelViewSet): # <-cette
queryset = Entry.objects.all()
serializer_class = EntrySerializer
filter_fields = ('author', 'status')
Il est défini dans un fichier appelé viewssets.py dans rest_framework. Si vous héritez de ModelViewSet, vous pouvez utiliser GET, POST, PUT et DELETE, et si vous modifiez la classe héritée en ReadOnlyModelViewSet, vous ne pouvez contrôler que GET.
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
Lorsque vous utilisez PUT ou DELETE, il est nécessaire de spécifier jusqu'à la clé primaire.
/api/users/
-> /api/users/1/
Pas bien
$ 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/
En effet, DjangoRestFramework a besoin de savoir quels objets mettre à jour / supprimer.
Il ne peut pas être reconnu dans la vue liste (/ api / users /
).
Je pense que vous obtiendrez une erreur comme celle-ci.
{"detail":"Method \"DELETE\" not allowed."}
{"detail":"Méthode\"DELETE\"N'est pas autorisé."}
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