ViewSets
mieć automatyczne metody wyświetlania, pobierania, tworzenia, aktualizowania, usuwania, ...
Chciałbym wyłączyć niektóre z nich, a rozwiązanie, które wymyśliłem, prawdopodobnie nie jest dobre, ponieważ OPTIONS
nadal określa je jako dozwolone.
Masz jakiś pomysł, jak to zrobić we właściwy sposób?
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)
UpdateModelMixin
. Jeśli chcesz użyć aktualizacji, ale nie łatki, mogę obecnie wymyślić dwa sposoby. Możesz albo nadpisać dozwolone metody w widoku i usunąć „poprawkę”, albo możesz nadpisaćpartial_update
metodę i wywołaniehttp_method_not_allowed(request, *args, **kwargs)
. Nie testowałem tego, więc nie jestem pewien, czy to działaclass SampleViewSet(viewsets.ReadOnlyModelViewSet)
.Możesz nadal używać
viewsets.ModelViewSet
i definiowaćhttp_method_names
w swoim ViewSet.Przykład
Po dodaniu
http_method_names
, nie będzie w stanie to zrobićput
ipatch
już.Jeśli chcesz,
put
ale nie chceszpatch
, możesz zatrzymaćhttp_method_names = ['get', 'post', 'head', 'put']
Wewnętrznie widoki DRF rozciągają się z Django CBV. Django CBV ma atrybut o nazwie http_method_names. Możesz więc używać http_method_names również z widokami DRF.
[Shameless Plug]: Jeśli ta odpowiedź była pomocna, spodoba ci się moja seria postów na temat DRF pod adresem https://www.agiliq.com/blog/2019/04/drf-polls/ .
źródło
python3
iDjango 1.10
po prostu dobrze.mixins.UpdateModelMixin
Chociaż minęło trochę czasu dla tego posta, nagle dowiedziałem się, że tak naprawdę jest to sposób na wyłączenie tych funkcji, możesz go edytować bezpośrednio w views.py.
Źródło: https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
źródło
Jeśli próbujesz wyłączyć metodę PUT z zestawu widoków DRF, możesz utworzyć niestandardowy router:
Po wyłączeniu metody na routerze dokumentacja schematu API będzie poprawna.
źródło
Jak wyłączyć metodę „DELETE” dla ViewSet w DRF
PS Jest to bardziej niezawodne niż jawne określenie wszystkich niezbędnych metod, więc istnieje mniejsze prawdopodobieństwo zapomnienia niektórych ważnych metod OPCJE, GŁOWA itp.
PPS domyślnie ma DRF
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
źródło
super
na poziomie klasy, nie maself
.W Django Rest Framework 3.xx możesz po prostu włączyć każdą metodę, dla której chcesz być włączona
ModelViewSet
, przekazując słownik doas_view
metody. W tym słowniku klucz musi zawierać typ żądania (GET, POST, DELETE itp.), A wartość musi zawierać odpowiednią nazwę metody (lista, pobieranie, aktualizacja itp.). Na przykład powiedzmy, że chcesz, abySample
model został utworzony lub odczytany, ale nie chcesz, aby był on modyfikowany. Więc to oznacza, że chceszlist
,retrieve
acreate
metoda się włączyć (i chcesz innym być wyłączone).Wszystko, co musisz zrobić, to dodać takie ścieżki
urlpatterns
:Jak widać, w powyższych ustawieniach routingu nie ma żądania
delete
iput
żądania, więc na przykład, jeśli wyśleszput
żądanie na adres URL, odpowie Ci 405Method Not Allowed
:źródło
Jeśli planujesz wyłączyć metody Put / Post / Destroy, możesz użyć
źródło