Python django rest框架中的简单过滤器

Python django rest框架中的简单过滤器,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有两个模型:作者和评论。我需要获得按作者id筛选的评论列表!大概是这样的: api/authors/作者id/comments 或者这个:api/注释?作者id=作者id 或者这个:api/comments/author/author\u id 以下是官方文件: 这里有一个类似的问题: 这对我没有帮助。不幸的是,在互联网上并没有这个任务的简单例子 请告诉我,我应该在代码中更改什么来执行此过滤 我的代码: #models.py 从django.db导入模型 从django.utils导入时区 类

我有两个模型:作者和评论。我需要获得按作者id筛选的评论列表!大概是这样的:

  • api/authors/作者id/comments
  • 或者这个:api/注释?作者id=作者id
  • 或者这个:api/comments/author/author\u id
  • 以下是官方文件:

    这里有一个类似的问题:

    这对我没有帮助。不幸的是,在互联网上并没有这个任务的简单例子

    请告诉我,我应该在代码中更改什么来执行此过滤

    我的代码:

    #models.py
    从django.db导入模型
    从django.utils导入时区
    类作者(models.Model):
    name=models.CharField(最大长度=200)
    类注释(models.Model):
    author=models.ForeignKey('Employee',related\u name='author\u comments')
    text=models.TextField(空白=真)
    published=models.BooleanField(默认值=True)
    
    #serializer.py
    从rest_框架导入序列化程序
    从core.models导入作者,注释
    类AuthorSerializer(serializers.HyperlinkedModelSerializer):
    类元:
    模型=作者
    字段='\uuuu所有\uuuu'
    类CommentSerializer(serializers.HyperlinkedModelSerializer):
    类元:
    模型=注释
    字段='\uuuu所有\uuuu'
    
    #views.py
    从rest\U框架导入视图集
    从模型导入作者,评论
    从序列化程序导入AuthorSerializer、CommentSerializer
    类CommentViewSet(ViewSet.ModelViewSet):
    queryset=Club.objects.all()
    序列化程序\u class=ClubSerializer
    
    #url.py
    从django.conf.url导入url,包括
    从rest_框架导入路由器
    从…起导入视图
    路由器=路由器。默认路由器()
    router.register(r'comments',views.CommentViewSet)
    
    您需要创建过滤查询集。在本例中,我按作者id筛选了注释

    视图.py

    class CommentFilter(generics.ListAPIView):
        serializer_class = CommentSerializer
    
        def get_queryset(self):
            """
            This view should return a list of all the comments for
            particular author by author portion of the URL.
            """
            username = self.kwargs['author_id']
            return Comment.objects.filter(author__id=author_id)
    
    from django.conf.urls import url, include
    from rest_framework import routers
    from . import views
    
    router = routers.DefaultRouter()
    router.register(r'comments', views.CommentViewSet)
    router.register(r'comment_list/(?P<author_id>\d+)/?$', views.CommentFilter,base_name="comment_list")
    
    url.py

    class CommentFilter(generics.ListAPIView):
        serializer_class = CommentSerializer
    
        def get_queryset(self):
            """
            This view should return a list of all the comments for
            particular author by author portion of the URL.
            """
            username = self.kwargs['author_id']
            return Comment.objects.filter(author__id=author_id)
    
    from django.conf.urls import url, include
    from rest_framework import routers
    from . import views
    
    router = routers.DefaultRouter()
    router.register(r'comments', views.CommentViewSet)
    router.register(r'comment_list/(?P<author_id>\d+)/?$', views.CommentFilter,base_name="comment_list")
    
    从django.conf.url导入url,包括
    从rest_框架导入路由器
    从…起导入视图
    路由器=路由器。默认路由器()
    router.register(r'comments',views.CommentViewSet)
    路由器.register(r'comment\u list/(?P\d+/?$),views.CommentFilter,base\u name=“comment\u list”)
    

    希望它能工作。

    有一个名为的功能,允许您将路由逻辑附加到
    视图集(这就是您的情况)。它看起来像是您想要的和最简单的。

    嵌套URL在DRF中是不必要的困难。对于链接提示的问题,最简单的方法是提取一个查询参数:

    class CommentViewSet(viewsets.ModelViewSet):
        serializer_class = ClubSerializer
    
        def get_queryset(self):
            queryset = Club.objects.all()
            author_id = self.request.query_params.get('author_id')
    
            if author_id is not None:
                queryset = queryset.filter(author_id=author_id)
            return queryset
    
    您可以像上面的选项2一样使用此选项:


    api/comments?author\u id=author\u id

    我应该在哪里添加此代码(我应该使用什么文件)?我是否应该更改URL.py或其他文件中的某些内容?如果我将该类添加到视图中,并将其用于url.py-我会得到一个错误:AssertionError:
    base_name
    参数未指定,并且无法从视图集中自动确定名称,因为它没有
    .queryset
    属性。我会得到一个错误:AssertionError:base_name参数未指定,并且无法从视图集中自动确定名称,因为它没有.queryset attributerouter.register(r'comment\u list/(?P\d+/?$),views.CommentFilter base\u name=“comment\u list”)另一个错误:view=viewset.as\u视图(映射,**路由.initkwargs)类型错误:as\u视图()采用1个位置参数,但2个为givenTry views.CommentFilter.as_view()在答案中加入引用是很好的,但是如果您加入了您认为最有助于回答问题的示例部分,则会大大改进答案。这样,如果链接将来断开,相关信息仍在此处。这将起作用,但您需要使用generics.ListAPIView而不是viewset。