- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Django REST 框架,并且我有一个带有额外列表路由方法的 View 集。我怎样才能让该方法的 URL 包含在 API 根页面中?
这是我的 View 集的简化版本:
class BookViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
permission_classes = (permissions.IsAuthenticated, )
@list_route(methods=['get'])
def featured(self, request):
queryset = self.filter_queryset(self.get_queryset()).filter(featured=True)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
我在 urls.py
中注册 View 集:
router = DefaultRouter()
router.register('books', BookViewSet)
urlpatterns = patterns(
url(r'^api/', include(router.urls), name='api_home'),
#...
)
books/featured
的 URL 路由正确,但是当我转到 http://localhost:8000/api
时,我只看到这个:
HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
{
"books": "http://localhost:8000/api/books/"
}
我怎样才能为这样的东西添加一个条目?
"book-featured-list": "http://localhost:8000/api/books/featured"
最佳答案
可以尝试继承负责api Root View 的DefaultRouter,重新定义get_api_root_view方法。
class MyRouter(routers.DefaultRouter):
def get_api_root_view(self):
"""
Return a view to use as the API root.
"""
api_root_dict = OrderedDict()
list_name = self.routes[0].name
for prefix, viewset, basename in self.registry:
api_root_dict[prefix] = list_name.format(basename=basename)
class APIRoot(views.APIView):
_ignore_model_permissions = True
def get(self, request, *args, **kwargs):
ret = OrderedDict()
namespace = request.resolver_match.namespace
for key, url_name in api_root_dict.items():
if namespace:
url_name = namespace + ':' + url_name
try:
ret[key] = reverse(
url_name,
args=args,
kwargs=kwargs,
request=request,
format=kwargs.get('format', None)
)
except NoReverseMatch:
# Don't bail out if eg. no list routes exist, only detail routes.
continue
ret['book-featured-list'] = '%s%s' % (ret['books'], 'featured/')
return Response(ret)
return APIRoot.as_view()
附言抱歉,在我发布答案之前没有看到您的评论
关于python - 在 Django REST 框架 API 根中包含 list_route 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30059795/
在我的应用程序中,我有这个 ModelViewSet 和一个 @list_route() 定义的函数来获取列表,但有不同的序列化程序。 class AnimalViewSet(viewsets.Mod
我尝试通过用 @list_route 标记来添加新端点,但是当我尝试导入 if 时: from rest_framework.decorators import list_route 找不到它。我需要
我正在创建一个“添加 friend ”功能,用户可以为另一个用户用户 URL 创建一个友谊请求对象:http://localhost:8000/api/v1/users/{username}/add_
我有一个 DRF View 集,想提供详细信息并列出具有相同名称的路由: class MyViewSet(ViewSet): # ... @detail_route(['post'])
有没有一种方法可以像在 DRF 中为 Root View 集使用过滤器一样为 @list_route 使用过滤器? 我有一个模型,我已经为其配置了过滤器和我无法配置的详细路线: class Listi
如果我有一个包含以下代码的 View 集: class ExtraRouteViewset(viewsets.GenericViewSet): @list_route(methods=['ge
我有一个 Game 模型,正在为它做相应的 REST 路由,例如GET/game, GET/game/1 等 我只希望 API 消费者获取现有游戏。我不希望他们能够任意发布新游戏。相反,他们应该通过特
我有一个带有额外 list_route 的 ModelViewSet,用于处理特定对象列表的 GET/POST: class PickViewset(viewsets.ModelViewSet):
我正在尝试通过 @list_route 和 @detail_route 装饰器使用嵌套路由。路线有效并返回数据,但我必须在地址栏中手动导航到它们。它们不会出现在可浏览 API 中的 DefaultRo
我正在使用 DRF 2.4.4 并遇到了 @list_route 装饰器需要 pk 的问题。这是我的代码摘录: class RunViewSet(ModelViewSet): serializ
我正在使用 Django REST 框架,并且我有一个带有额外列表路由方法的 View 集。我怎样才能让该方法的 URL 包含在 API 根页面中? 这是我的 View 集的简化版本: class B
DRF 中的 ModelViewSets 确实很有帮助,但我正在尝试扩展其中一个,以便能够在 GET 请求中返回对象列表,并在 POST 请求中处理列表。到目前为止,我似乎需要使用 @list_rou
我是一名优秀的程序员,十分优秀!