django rest框架中的简单过滤器
我有2个模型:作者和评论。我需要获取由author_id过滤的评论列表!事情是这样的:django rest框架中的简单过滤器
- API /作家/ AUTHOR_ID /评论
- 还是这样:API /评论AUTHOR_ID = AUTHOR_ID
- 或本: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")
希望工程。
DRF-extensions有一个名为Nested routes功能,可以让你的路由逻辑追加到ViewSets
(这是你的情况下)。它看起来像你想要的和最简单的。
在你的答案中包含引文是很好的,但如果你包含你认为最能帮助回答问题的那部分例子,它会大大改善。这样,如果未来链路断开,相关信息仍然存在。 – 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
我应该在哪里添加此代码(我应该使用什么文件)?我应该更改urls.py或其他文件中的内容吗? 如果我添加这个类来查看,并使用它urls.py - 我得到一个错误: _AssertionError:'base_name'参数未指定,并且不能自动确定从视图中的名称,因为它没有'.queryset'属性._ – yestema
我收到一个错误: ** AssertionError:未指定base_name参数,并且无法自动确定视图集中的名称,因为它没有.queryset属性** – yestema
router.register( r'comment_list /(?P \ d +)/?$',views.CommentFilter base_name =“comment_list”) –
Darshan