当我们查看文章详情时,需要将这篇文章的所有评论都过滤出来。在原生django中,我们需要对Comment进行过滤,Comment.obgects.filter(article=article_obj), 在restframework中则要用到restframework中的FilterBackends,
class CommentFilterBackends(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
article_pk = request.query_params.get('pk')
return queryset.filter(article_id=article_pk)
# 127.0.0.1:8000/api/v1/comment/?token=61cca770-c8d8-4e8c-b7fa-c3c80e9e7362&pk=1
class CommentView(ListAPIView, CreateAPIView):
queryset = Comment.objects.all()
filter_backends = [CommentFilterBackends, ]
def get_serializer_class(self):
if self.request.method == 'GET':
return CommentSerializer
elif self.request.method == 'POST':
return PostCommentSerializer
def perform_create(self, serializer):
user = self.request.user
article_pk = self.request.query_params.get('pk')
article_obj = Article.objects.filter(id=article_pk).first()
comment_obj = serializer.save(user=user, article=article_obj)
在commentView中指定了filter_backends=[CommentFilterBackends,]也就是上面写的过滤的类,这样每次请求进来时,都会经过Filter过滤,过滤的条件是从url中拿到article_pk,然后对queryset进行过滤,而queryset = Comment.objects.all(),所以结果就是实现了对当前文章的过滤。
可以看到filter_backends是一个列表,所以可以指定多个过滤类,而将filter_backends作为类的属性存在,当我们有多个视图时,只需要指定一下filter_backends属性即可,可以说drf是非常强大了。