django Rest框架-带有自定义列表视图和URL参数的视图集

django Rest框架-带有自定义列表视图和URL参数的视图集,django,django-rest-framework,Django,Django Rest Framework,我有以下设置: 我想列出一年中所有的假期。这就是为什么我不使用默认列表视图,而是像这样实现自己的列表视图: class HolidayViewSet(mixins.RetrieveModelMixin, GenericViewSet): @list_route() def year(self, request, year=get_today().year): public_holidays = self.get_queryset().filter(date__year=year)

我有以下设置:

我想列出一年中所有的假期。这就是为什么我不使用默认列表视图,而是像这样实现自己的列表视图:

class HolidayViewSet(mixins.RetrieveModelMixin, GenericViewSet):
@list_route()
def year(self, request, year=get_today().year):
    public_holidays = self.get_queryset().filter(date__year=year)
    page = self.paginate_queryset(public_holidays)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)
    serializer = self.get_serializer(public_holidays, many=True)
    return Response(serializer.data)
class TestListView(generics.ListAPIView):
    serializer_class = TestSerializer

    def get(self, request, *args, **kwargs):
        year = kwargs.get('year', '')
        query_set = Test.objects.filter(year__exact=year) # Test is my test model
        serializer = self.get_serializer(query_set, many=True)
        return Response(serializer.data)
如果我使用默认值/假日/年份/我会得到当前年份的结果

但当我试图传递一个参数时,我会得到一个404。404页面(在调试模式下)甚至向我显示了正确的URL模式:

api/v1/ ^holiday/year/$ [name='holiday-year']
api/v1/ ^holiday/year\.(?P<format>[a-z0-9]+)/?$ [name='holiday-year']
api/v1/^holiday/year/$[name='holiday-year']
api/v1/^holiday/year\(?P[a-z0-9]+)/?$[name='holiday-year']
不幸的是,在本报告中,这一方面没有涉及

你知道为什么我去2017年假日的路线不起作用吗

谢谢!
Ron

DRF区分了
列表
细节
请求<代码>列表请求不应有额外的路径参数(即
/{id}
),而
细节
请求则由它定义


它的意思是,装饰者创建
@list\u-route
端点,而
@detail\u-route
将创建
/holiday/{id}/year
端点。

好的,我的解决方法是使用
django筛选器

我的过滤器:

class HolidayFilter(filters.FilterSet):
    """
    This filter can be used to filter holidays by different values in API views or viewsets.
    See http://django-filter.readthedocs.io/en/1.1.0/guide/rest_framework.html
    """
    year = filters.NumberFilter(name='date', lookup_expr='year')

    class Meta:
        model = Holiday
        fields = ['date']
class HolidayListViewSet(ModelViewSet):

    def list(self, request, *args, **kwargs):
        # Apply filters
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        # Pagination
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        # Serializer
        serializer = self.get_serializer(queryset, many=True)
        # Response
        return Response(serializer.data)
/api/v1/holiday/?year=2016
我的视图集:

class HolidayFilter(filters.FilterSet):
    """
    This filter can be used to filter holidays by different values in API views or viewsets.
    See http://django-filter.readthedocs.io/en/1.1.0/guide/rest_framework.html
    """
    year = filters.NumberFilter(name='date', lookup_expr='year')

    class Meta:
        model = Holiday
        fields = ['date']
class HolidayListViewSet(ModelViewSet):

    def list(self, request, *args, **kwargs):
        # Apply filters
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        # Pagination
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        # Serializer
        serializer = self.get_serializer(queryset, many=True)
        # Response
        return Response(serializer.data)
/api/v1/holiday/?year=2016
网址:

class HolidayFilter(filters.FilterSet):
    """
    This filter can be used to filter holidays by different values in API views or viewsets.
    See http://django-filter.readthedocs.io/en/1.1.0/guide/rest_framework.html
    """
    year = filters.NumberFilter(name='date', lookup_expr='year')

    class Meta:
        model = Holiday
        fields = ['date']
class HolidayListViewSet(ModelViewSet):

    def list(self, request, *args, **kwargs):
        # Apply filters
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        # Pagination
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        # Serializer
        serializer = self.get_serializer(queryset, many=True)
        # Response
        return Response(serializer.data)
/api/v1/holiday/?year=2016

谢谢你的支持,也许这对其他人有帮助

我认为我的方法很简单,但很有用。只需按如下方式确定您的路由器:

urlpatterns += [
    path(r'holiday/<int:year>/', TestListView.as_view()),
]

检查这个问题:谢谢,但这似乎不是一个干净的解决方案。您使用的是一个非常过时的DRF文档版本。您的Django REST框架版本是什么?这一部分解释了如何构建URL:感谢您的输入。但django告诉我已经有了一条路线。我想使用它而不需要创建单独的路由。好吧,关于404页面,我得到了我想要的路由。即使使用列表和路径。但是我怎么用呢?@Ron“我想走哪条路就走哪条路”——不完全是这样<代码>^holiday/year\(?P[a-z0-9]+)/?$生成格式为
holiday/year.[a-z0-9]+
的路径。不
holiday/year/{id}
我知道。但不幸的是——正如我所指出的——我无法使用这条路线。我没有试身份证,我试了好几年。