Django Rest Framework Пользовательские конечные точки - PullRequest
0 голосов
/ 09 января 2020

Я недавно унаследовал API, созданный с Django и DRF. Мне нужно добавить некоторые конечные точки в API, но никогда раньше не работал с Django или DRF, поэтому я пытаюсь набрать скорость как можно быстрее.

Мне интересно, как сделать пользовательские конечные точки, которые не работают не просто переводить данные / из базы данных. Например, может быть конечной точкой, которая считывает данные из БД, затем составляет отчет и возвращает его вызывающей стороне в JSON. Но я полагаю, что в данный момент самый простой способ - это тот, который при нажатии на конечную точку просто печатает «Hello World» в журнале и возвращает пустую страницу. Я читал документы, и пока все, что я вижу, это материал о сериализаторах, когда мне действительно нужно иметь возможность вызывать пользовательский блок кода.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

, если вы хотите, чтобы ваша конечная точка REST имела все: GET, POST, PUT, DELETE и т. Д. c. функциональности, то вы должны зарегистрировать маршрут в вашем urls.py:

urls.py:

from rest_framework import routers
from django.urls import path, include
from . import views

router = routers.DefaultRouter()
router.register(r'hello', views.HelloWorldViewSet)

urlpatterns = [
    # Wire up our API using automatic URL routing.
    # rest_framework api routing
    path('api/', include(router.urls)),
    # This requires login for put/update while allowing get (read-only) for everyone.
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

теперь URL: / hello / указывает на HelloWorldViewSet.

в вашем views.py добавьте HelloWorldViewSet, который будет наследоваться от класса rest_framework.viewsets.ViewSet. Вы можете переопределить поведение класса ViewSet по умолчанию, определив следующие «действия»: list (), create (), retrieve (), update (), part_update (), destroy (). Для отображения "hello world" на GET вам нужно только переопределить list():

, поэтому в ваших views.py:

from rest_framework import viewsets
from rest_framework.response import Response

class HelloWorldViewSet(viewsets.ViewSet):
    def list(self, response):
        return Response('Hello World')

Итак, в вашей более продвинутой функции list() Вы должны взаимодействовать с базой данных, чтобы получить нужные данные, обработать их и создать отчет как сериализуемый словарь json и вернуть его как объект Response.

Если вы не хотите чтобы переопределить стандартное действие list, вместо этого вы можете добавить новый action к HelloWorldViewSet, назовем его report:

, так что в ваших views.py:

from rest_framework import viewsets
from rest_framework.response import Response

class HelloWorldViewSet(viewsets.ViewSet):
    @action(detail=False)
    def report(self, request, **kwargs):
        return Response('Hello World')

Надеюсь, это то, что вы искали.

Обратите внимание, что вам не нужен django -rest-framework, если вы не заинтересованы в POST, PUT, PATCH, DELETE, et c ... вы можете просто добавить path к вашему urls.py, который указывает на Django функцию просмотра, которая возвращает Django JsonResponse объект, содержащий ваш отчет.

0 голосов
/ 10 января 2020

Один хороший вариант для вас - действия DRF. Документы здесь

Действие позволяет вам выбрать подходящее представление для того, что вы хотите сделать, так что вы можете просто вставить вещи в API, который вы унаследовали. Никаких дополнительных настроек не требуется, они отображаются рядом с обычными маршрутами.

...