Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django REST Frameworkに再挑戦 その6 Filterring a QuerySet in a ListAPIView

概要

Django REST Frameworkに再挑戦 その6 Filterring a QuerySet in a ListAPIView

参考サイト

www.django-rest-framework.org

www.codingforentrepreneurs.com

Filterring a QuerySet in a ListAPIView

  • posts/views.pyの検索部分をコピペする。
 query = request.GET.get("q")
    if query:
        queryset_list = queryset_list.filter(
                Q(title__icontains=query)|
                Q(content__icontains=query)|
                Q(user__first_name__icontains=query) |
                Q(user__last_name__icontains=query)
                ).distinct()
  • posts/api/views.py のListviewを追記する。
from django.db.models import Q

class PostListAPIView(ListAPIView):
    # queryset = Post.objects.all()
    serializer_class = PostListSerializer


    def get_queryset(self, *args, **kwargs):
        #queryset_list = super(PostListAPIView, self).get_queryset(*args, **kwargs)
        queryset_list = Post.objects.all()
        # フィルターを使いたい場合は、queryset_list = Post.objects.filter(user=self.request.user)
        query = self.request.GET.get("q")
        if query:
            queryset_list = queryset_list.filter(
                    Q(title__icontains=query)|
                    Q(content__icontains=query)|
                    Q(user__first_name__icontains=query) |
                    Q(user__last_name__icontains=query)
                    ).distinct()
        return queryset_list
  • api/posts/?q=my%20titleのような文字列をURLで指定すると期待通りの検索がされるはず!

  • /api/posts/?q=kawagoeのように、ユーザー名でも検索できる。

  • filtersを追記する。公式サイトは以下のページ。

Filtering - Django REST framework

from rest_framework.filters import (
    SearchFilter,
    OrderingFilter,
)
...
class PostListAPIView(ListAPIView):
    # queryset = Post.objects.all()
    serializer_class = PostListSerializer
    filter_backends = [SearchFilter]
    search_fields = ['title', 'content', 'user__first_name']
...
  • /api/posts/?search=newで、検索ができるようになる!!

  • サードパーティの、djang-filterなども使いやすいぽいぞ。

Filtering - Django REST framework

  • OrderingFilterをつけてみる。
class PostListAPIView(ListAPIView):
    # queryset = Post.objects.all()
    serializer_class = PostListSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['title', 'content', 'user__first_name']
  • これでordering=titleなどで、title順にソートできる。

ajaxで、これはかなり使えそうやな〜!