Написание пользовательских функций внутри общего представления на основе классов в django rest framework

Мне нужно написать пользовательскую функцию внутри представления, основанного на классе, которая выглядит следующим образом:

class ExampleView(ListCreateAPIView,
                  UpdateAPIView,
                 DestroyAPIView):
    queryset = Example.objects.all()
    serializer_class = ExampleSerializer
    

    def get(self, request, *args, **kwargs):
        /.........some code............./

    def random_custom(self, request, *args, **kwargs):
        /.........some code............./

Выше у меня есть произвольная пользовательская функция, которую мне нужно вызвать из url. Теперь я не уверен, как это сделать. Если бы это был modelviewset, мы могли бы легко сделать это следующим образом:

path("example/",users.ExampleView.as_view({"get": "random_custom"}),
     ),

Я уже делал это в ModelVIewset, т.е. вызывал пользовательские функции, как указано выше, но я не уверен, как это сделать в genericviews, как указано выше.

Пробовали ли вы поместить random_custom() в метод get()? Он должен выполняться сразу после инициализации метода GET клиентом.

class ExampleView(...):
    ...
    

    def get(self, request, *args, **kwargs):
        self.random_custom()
        /.........some code............./

    def random_custom(self, request, *args, **kwargs):
        /.........some code............./

Код, который принимает решение о том, какой метод в вашем классе, производном от APIView, следует вызвать, находится в APIView.dispatch(). Вы можете прочитать источник здесь.

Вот как это работает:

  1. Преобразуйте имя метода (например, GET, POST, OPTIONS) в нижний регистр. Проверьте, является ли имя метода действительным методом HTTP. Если нет, верните код ошибки.
  2. Проверьте, определяет ли объект версию имени метода в нижнем регистре. Если нет, верните код ошибки.
  3. Используйте getattr() для получения этого метода и вызовите его.

Это означает, что есть только два способа перенаправить вызов из get().

  1. Определите get() и заставьте его вызывать random_custom(), как описывает @NixonSparrow.
  2. Переопределите метод dispatch(), чтобы вызвать что-то еще.

Это только два способа сделать это.

Вернуться на верх