Django REST Frameworkに再挑戦 その6 Filterring a QuerySet in a ListAPIView
概要
Django REST Frameworkに再挑戦 その6 Filterring a QuerySet in a ListAPIView
参考サイト
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で、これはかなり使えそうやな〜!