2017-02-16 87 views
0

我有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) 

回答

0

您需要創建過濾查詢集。這裏,在這個例子中,我過濾的評論作者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

0

DRF-extensions有一個名爲Nested routes功能,可以讓你的路由邏輯追加到ViewSets(這是你的情況下)。它看起來像你想要的和最簡單的。

+0

在你的答案中包含引文是很好的,但如果你包含你認爲最能幫助回答問題的那部分例子,它會大大改善。這樣,如果未來鏈路斷開,相關信息仍然存在。 – Taegost

0

嵌套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

相關問題