- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在rest_framework 中为几个类别创建不同的 View 。但所有类别都来自同一模型。
令我印象深刻的是,这些类别可以作为关键字传递给 urlpatterns
(或通过 DefaultRouter
访问)。然后就可以根据需要使用关键字来过滤模型了。
这是我的观点:
class CategoryRankedViewSet(ModelViewSet):
serializer_class = CategoriesSerializer
def get_queryset(self):
return Categories.objects.all().order_by(self.kwargs['category'])
我能够完成这项工作的一种方法是:
urlpatterns = [path('<' + category + '>/', CategoryRankedViewSet.as_view({'get': 'list'}), name=category) for category in CATEGORIES]
但它并不完美,因为参数的键设置为 CATEGORIES
中第一项的值,而不是像 category
这样更通用的术语。
我正在考虑 DefaultRouter
,但是否可以将参数传递给 DefaultRouter
并不明显。
我也在寻找可以访问文字 url 并以这种方式访问类别的方法。在 DRF 的 ViewSet 中这似乎不可能。
此外,DefaultRouter
的 base_name
可以动态设置,但我找不到如何从 ViewSet 访问 base_name
。
有人尝试过这个方法吗?有更有效的方法吗?
更新事实证明,path()
具有 kwargs
属性,该属性可以传递关键字而不将它们作为 url 参数包含在内。因此不要将类别作为 url 参数传递。只需在 url 路径中使用类别变量并将类别作为关键字传递即可。
urlpatterns = [path(category + '/', CategoryRankedViewSet.as_view({'get': 'list'}), kwargs={'category': category}, name=category) for category in CATEGORIES]
有没有办法使用DefaultRouter
复制这个???
最佳答案
View 集可以通过使用@action装饰器装饰方法来标记额外的操作用于路由。您可以使用 Action 装饰器来解决您的问题
from rest_framework.decorators import action
class CategoryRankedViewSet(ModelViewSet):
serializer_class = CategoriesSerializer
def get_queryset(self):
return Categories.objects.all().order_by(self.kwargs['category'])
@action(methods=['get'],detail=False,url_path=r'list/(?P<category>[\w-]+)',url_name='categorylist')
def get_category(self,request,category=None):
return Categories.objects.all().order_by(category)
所以,现在您可以在 url 中提供任何类别并使用类别变量访问它。您的网址将类似于 rooturl/list/{categoryhere}。此网址将调用 get_category 方法。请记住,url_path 仅使用正则表达式,因此您不能在那里使用 slug。你可以在这个 link 中看到 Action 装饰器的代码你可以在djagorest中看到@action装饰器的例子。我希望这能解决您的问题。
关于python - 将动态参数传递给 urlpatterns 或 DefaultRouter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57749288/
我正在玩我的网络应用程序,react-router包,我想做一些嵌套路线。这是我所做的 由于 DefaultRoute,
我正在设置一个新的测试,并且我想进行相反的操作。 router = DefaultRouter() router.register('profile', views.UserProfileViewSe
我开始学习如何在网络应用程序中使用backbonejs,但应用程序启动时,我遇到了默认路由的一些问题。 这是我的脚本 var AppRouter = Backbone.Router.extend({
我正在阅读http://www.django-rest-framework.org/api-guide/routers#usage并且无法理解 base_name 是什么。我还尝试添加自定义操作,但路
我想在rest_framework 中为几个类别创建不同的 View 。但所有类别都来自同一模型。 令我印象深刻的是,这些类别可以作为关键字传递给 urlpatterns (或通过 DefaultRo
您将如何保护 DefaultRouter() 以便用户在登录前无法查看 API Root? class OrderViewSet(viewsets.ReadOnlyModelViewSet):
当我将 ASP.NET WebAPI 解决方案发布到远程 IIS 服务器 时,我收到错误消息: Message: System.ArgumentException: A route named 'De
我将react-router与ES6类一起使用,它不断抛出错误 Uncaught TypeError: Cannot call a class as a function 指的是默认路由的声明。大部分
我想知道下面示例中的 IndexRoute 和 DefaultRoute 有什么区别?据我了解,在这两种情况下 Home 都会被渲染,对吗? 和 最佳答案 Defaul
我想定义一个访问某个api的路径。到目前为止什么有效(urls.py): router = routers.DefaultRouter() router.register(r'test', views
我正在使用 DRF 提供的 DefaultRouter,因为我需要一个根 api View 。但是,该 View 上的项目没有任何逻辑顺序。我查看了源代码,发现每个条目都被放入字典中(本质上没有排序)
我正在创建一个简单的 Python API,其中包含两个名为 snippets 的应用程序。和 polls .对于我的 API 的单一入口点,我正在使用 DefaultRouter类而不是常规的基于函
我有以下内容: 当使用 DefaultRoute 时,SearchDashboard 呈现不正确,因为任何 *Das
我正在努力生成文档(或者简单地 - 整个项目)。我对 Django 和 Python 几乎不陌生,所以也许我的问题很微不足道。 我在 Django Rest Framework 项目中有一堆定义良好的
我有一个 Django 项目,其中我制作了 3 个不同的应用程序:“blog”、“users”、“api”。这是一个可以使用模型帖子发布消息的网站。我想使用 Django Rest API 来访问模型
我是一名优秀的程序员,十分优秀!