Django restframework 筛选

当我们查看文章详情时,需要将这篇文章的所有评论都过滤出来。在原生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是非常强大了。

上一篇:Django restframework 视图

下一篇:Django restframework 版本