Django Rest Framework 自定义端点

tho*_*sbp 4 django django-rest-framework

我最近继承了一个用 Django 和 DRF 构建的 API。我需要向 API 添加一些端点,但之前从未使用过 Django 或 DRF,因此我试图尽快上手。

我想知道如何执行自定义端点,而不仅仅是从后端数据库转换数据。例如,一个端点可能从数据库读取数据,然后编译报告并将其以 JSON 格式返回给调用者。但我认为现在最简单的方法是当端点被击中时仅将“Hello World”打印到日志并返回空白页面。

如果这看起来很基本,我很抱歉。我一直在阅读文档,到目前为止我所能看到的只是有关序列化器的内容,而我真正需要的是能够调用自定义代码块。

谢谢。

Ous*_*uss 8

如果您希望 REST 端点具有所有:GET、POST、PUT、DELETE 等功能,那么您必须在 urls.py 中注册一个路由:

网址.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'))
]
Run Code Online (Sandbox Code Playgroud)

现在 url: /hello/ 指向 HelloWorldViewSet。

在views.py中添加将从rest_framework.viewsets.ViewSet类继承的HelloWorldViewSet。您可以通过定义以下“操作”来覆盖 ViewSet 默认类行为:list()、create()、retrieve()、update()、partial_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, request):
        return Response('Hello World')
Run Code Online (Sandbox Code Playgroud)

因此,在更高级的list()函数中,您必须与数据库交互,检索所需的数据,对其进行处理,并将报告创建为 json 可序列化字典,并将其作为对象返回Response

如果您不想覆盖标准list操作,您可以添加一个新的操作,我们action称之为:HelloWorldViewSetreport

所以在你的views.py中:

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action

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

我希望这就是您正在寻找的。

POST请注意,如果您对、PUTPATCHDELETE等不感兴趣,则不需要 django-rest-framework ...您可以简单地添加一个path指向urls.pyDjango 视图函数的 Django 视图函数,该函数返回JsonResponse包含您的报告的 Django 对象。