ViewSets
haben automatische Methoden zum Auflisten, Abrufen, Erstellen, Aktualisieren, Löschen, ...
Ich möchte einige davon deaktivieren, und die Lösung, die ich gefunden habe, ist wahrscheinlich keine gute, da OPTIONS
diese weiterhin als zulässig angibt.
Irgendeine Idee, wie man das richtig macht?
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
def list(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
def create(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
Die Definition von ModelViewSet
lautet:
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet)
Also, anstatt ModelViewSet
zu erweitern, warum nicht einfach das verwenden, was Sie brauchen? Also zum Beispiel:
from rest_framework import viewsets, mixins
class SampleViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet):
...
Bei diesem Ansatz sollte der Router nur Routen für die enthaltenen Methoden generieren.
Referenz :
Sie können weiterhin viewsets.ModelViewSet
Verwenden und http_method_names
In Ihrem ViewSet definieren.
Beispiel
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
http_method_names = ['get', 'post', 'head']
Sobald Sie http_method_names
Hinzugefügt haben, können Sie put
und patch
nicht mehr ausführen.
Wenn Sie put
wollen, aber nicht patch
wollen, können Sie http_method_names = ['get', 'post', 'head', 'put']
Behalten
Intern erstrecken sich DRF-Ansichten von Django= CBV. Django CBV hat ein Attribut namens http_method_names. Sie können http_method_names also auch mit DRF-Ansichten verwenden.
[Shameless Plug]: Wenn diese Antwort hilfreich war, werden Ihnen meine Posts über DRF unter https://www.agiliq.com/blog/2019/04/drf-polls/ gefallen.
Wenn Sie versuchen, die PUT-Methode in einem DRF-Viewset zu deaktivieren, können Sie einen benutzerdefinierten Router erstellen:
from rest_framework.routers import DefaultRouter
class NoPutRouter(DefaultRouter):
"""
Router class that disables the PUT method.
"""
def get_method_map(self, viewset, method_map):
bound_methods = super().get_method_map(viewset, method_map)
if 'put' in bound_methods.keys():
del bound_methods['put']
return bound_methods
Durch Deaktivieren der Methode am Router wird Ihre API-Schemadokumentation korrekt.
Deaktivieren der Methode "DELETE" für ViewSet in DRF
class YourViewSet(viewsets.ModelViewSet):
http_method_names = [m for m in super().http_method_names if m != 'delete']
P.S. Dies ist zuverlässiger als die explizite Angabe aller erforderlichen Methoden, sodass die Wahrscheinlichkeit geringer ist, dass einige wichtige Methoden wie OPTIONEN, KOPF usw. vergessen werden .
P.P.S. Standardmäßig hat DRF http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']