django rest框架中的简单过滤器

问题描述:

我有2个模型:作者和评论。我需要获取由author_id过滤的评论列表!事情是这样的:django rest框架中的简单过滤器

  1. API /作家/ AUTHOR_ID /评论
  2. 还是这样:API /评论AUTHOR_ID = AUTHOR_ID
  3. 或本:API /评论/作者/ author_id

这是官方文档:http://www.django-rest-framework.org/api-guide/filtering

这里是类似的问题:Filtering in django rest framework 他们不帮我。不幸的是,在互联网上没有完整的简单例子。 请告诉我,我应该在我的代码中更改哪些内容来执行此过滤?

这里是我的代码:

models.py:

from django.db import models 
from django.utils import timezone 

class Author(models.Model): 
    name = models.CharField(max_length=200) 

class Comment(models.Model): 
    author = models.ForeignKey('Employee', related_name='author_comments') 
    text = models.TextField(blank=True) 
    published = models.BooleanField(default=True) 

serializer.py:

from rest_framework import serializers 
from core.models import Author, Comment 

class AuthorSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Author 
     fields = '__all__' 

class CommentSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Comment 
     fields = '__all__' 

views.py:

from rest_framework import viewsets 
from models import Author, Comment 
from serializers import AuthorSerializer, CommentSerializer 

class CommentViewSet(viewsets.ModelViewSet): 
    queryset = Club.objects.all() 
    serializer_class = ClubSerializer 

urls.py:

from django.conf.urls import url, include 
from rest_framework import routers 
from . import views 

router = routers.DefaultRouter() 
router.register(r'comments', views.CommentViewSet) 

您需要创建过滤查询集。这里,在这个例子中,我过滤的评论作者ID

views.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) 

urls.py

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") 

希望工程。

+0

我应该在哪里添加此代码(我应该使用什么文件)?我应该更改urls.py或其他文件中的内容吗? 如果我添加这个类来查看,并使用它urls.py - 我得到一个错误: _AssertionError:'base_name'参数未指定,并且不能自动确定从视图中的名称,因为它没有'.queryset'属性._ – yestema

+0

我收到一个错误: ** AssertionError:未指定base_name参数,并且无法自动确定视图集中的名称,因为它没有.queryset属性** – yestema

+0

router.register( r'comment_list /(?P \ d +)/?$',views.CommentFilter base_name =“comment_list”) – Darshan

DRF-extensions有一个名为Nested routes功能,可以让你的路由逻辑追加到ViewSets(这是你的情况下)。它看起来像你想要的和最简单的。

+0

在你的答案中包含引文是很好的,但如果你包含你认为最能帮助回答问题的那部分例子,它会大大改善。这样,如果未来链路断开,相关信息仍然存在。 – Taegost

嵌套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_id=author_id