Написание пользовательских функций внутри общего представления на основе классов в 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(). Вы можете прочитать источник здесь.
Вот как это работает:
- Преобразуйте имя метода (например, GET, POST, OPTIONS) в нижний регистр. Проверьте, является ли имя метода действительным методом HTTP. Если нет, верните код ошибки.
- Проверьте, определяет ли объект версию имени метода в нижнем регистре. Если нет, верните код ошибки.
- Используйте
getattr()для получения этого метода и вызовите его.
Это означает, что есть только два способа перенаправить вызов из get().
- Определите get() и заставьте его вызывать random_custom(), как описывает @NixonSparrow.
- Переопределите метод dispatch(), чтобы вызвать что-то еще.
Это только два способа сделать это.