python - 将动态参数传递给 urlpatterns 或 DefaultRouter

标签 python django django-rest-framework

我想在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 中这似乎不可能。

此外,DefaultRouterbase_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/

相关文章:

django - 如何将带有 OneToOneField 的模型添加到某些 ForeignKey 自定义用户模型中的每一个

css - 在 Django 中使用 GAE 显示图像/CSS

python - Django REST Framework 不以 PUT 形式显示值

django-rest-framework - 如何获得Django Rest Framework将小数舍入到最大精度?

python - 使用 fork 的 Flask github 存储库为 python 应用程序构建 Docker 镜像的问题

python - 如何创建 python 空数据帧,其中 df.empty 结果为 True

python - 如何替换数据框每行中大于特定阈值的前 n 个元素

python - Pandas date_range 在月初生成月度数据

python - Django / python : How to group queryset results by date?

python - Django Rest Framework : Create/Update by id, 输出字典