我一直在寻找一个合适的解释,并且它们都很简短... 你何时使用@api_view装饰器而不是基于类的django rest framework app
答案 0 :(得分:18)
通常选择CBV,除非它妨碍你,然后使用基于函数的视图和装饰器保持简单。在Django和REST Framework中,列表,分页和CRUD操作等典型事物的逻辑已经编写完成,并且可以通过类和mixin的形式轻松扩展。如果您的视图逻辑正在做一些明显不同的事情,那么基于函数的视图可能是合适的。当然,您可以在您的应用中使用这两种方法。
答案 1 :(得分:4)
就个人而言,只有当我需要做一些非常具体/自定义的事情时,我才会使用APIView基类或@api_view装饰器。例如,要显示端点的URLS列表,请以特定方式聚合来自不同模型的数据,等等。
每当我处理常规列表,创建,更新和删除操作时,我都会使用其他类(检索,创建,更新和销毁视图或混合)。
使用 @api_view 装饰器制作我的应用的所有端点列表的示例:
from django.core.urlresolvers import NoReverseMatch
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse
from .urls import urlpatterns
@api_view(('GET',))
def root_endpoint(request, format=None):
"""
List of all the available resources of this RESTful API.
"""
endpoints = []
# loop over url modules
for urlmodule in urlpatterns:
# is it a urlconf module?
try:
urlmodule.urlconf_module
is_urlconf_module = True
except AttributeError:
is_urlconf_module = False
# if url is really a urlmodule
if is_urlconf_module:
# loop over urls of that module
for url in urlmodule.urlconf_module.urlpatterns:
# TODO: configurable skip url in settings
# skip api-docs url
if url.name in ['django.swagger.resources.view']:
continue
# try adding url to list of urls to show
try:
endpoints.append({
'name': url.name.replace('api_', ''),
'url': reverse(url.name, request=request, format=format)
})
# urls of object details will fail silently (eg: /nodes/<slug>/)
except NoReverseMatch:
pass
return Response(endpoints)
此代码位于github。