web-dev-qa-db-de.com

Deaktivieren Sie eine Methode in einem ViewSet, Django-Rest-Framework

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)
94
db0

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 :

ModelViewSet

201
SunnySydeUp

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.

98
Akshar Raaj

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.

4
storn

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']

1
pymen