Python 将动态参数传递给urlpatterns或DefaultRouter

Python 将动态参数传递给urlpatterns或DefaultRouter,python,django,django-rest-framework,Python,Django,Django Rest Framework,我想在rest_框架中为几个类别创建不同的视图。但所有类别都来自同一个模型 我觉得这些类别可以作为关键字传递给urlpatterns(或者通过DefaultRouter访问)。然后,您可以根据需要使用关键字筛选模型 以下是我的看法: class CategoryRankedViewSet(ModelViewSet): serializer_class = CategoriesSerializer def get_queryset(self): return Ca

我想在rest_框架中为几个类别创建不同的视图。但所有类别都来自同一个模型

我觉得这些类别可以作为关键字传递给
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]

使用
DefaultRouter

是否有任何方法可以复制此操作?视图集可以通过使用@action装饰器装饰一个方法,为路由标记额外的操作。 您可以使用action decorator解决您的问题

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)
来自rest\u framework.decorators导入操作
类类别RankedViewSet(ModelViewSet):
序列化程序\u类=分类序列化程序
def get_queryset(自我):
返回Categories.objects.all().order_by(self.kwargs['category'])
@操作(方法=['get'],细节=False,url\u path=r'list/(?P[\w-]+)',url\u name='categorylist')
def get_类别(自我、请求、类别=无):
返回Categories.objects.all()
所以,现在您可以在url中提供任何类别,并使用category变量访问它。 您的url类似于rooturl/list/{categoryhere}。此url将调用get\u category方法。 记住,url\u路径只使用正则表达式,因此不能在那里使用slug。 您可以在这里看到action decorator的代码,也可以在中看到@action decorator的示例。
我希望这能解决您的问题。

视图集可以通过使用@action装饰器装饰方法,为路由标记额外的操作。 您可以使用action decorator解决您的问题

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)
来自rest\u framework.decorators导入操作
类类别RankedViewSet(ModelViewSet):
序列化程序\u类=分类序列化程序
def get_queryset(自我):
返回Categories.objects.all().order_by(self.kwargs['category'])
@操作(方法=['get'],细节=False,url\u path=r'list/(?P[\w-]+)',url\u name='categorylist')
def get_类别(自我、请求、类别=无):
返回Categories.objects.all()
所以,现在您可以在url中提供任何类别,并使用category变量访问它。 您的url类似于rooturl/list/{categoryhere}。此url将调用get\u category方法。 记住,url\u路径只使用正则表达式,因此不能在那里使用slug。 您可以在这里看到action decorator的代码,也可以在中看到@action decorator的示例。
我希望这能解决您的问题。

是否覆盖
get\u category
覆盖
get\u queryset
?不,它不是覆盖get\u queryset,get\u category是一个全新的方法。在@action decorator中,您必须传递url\u路径才能使用该路径访问get\u category。是否
get\u category
覆盖
get\u queryset
?不,它不是覆盖get\u queryset,get_category是一个全新的方法。在@action decorator中,您必须传递url_路径才能使用该路径访问get_category。