Python django rest框架中的简单过滤器
我有两个模型:作者和评论。我需要获得按作者id筛选的评论列表!大概是这样的: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导入时区 类
#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。