【Django】django-filterで複数キーワードAND・OR検索をする方法。
2022/5/29
2022/5/29
django-filterを使って、特定フィールド(今回は記事タイトル)に対して複数キーワードで「AND検索」や「OR検索」をしたい。
調べてながら試してみて実際に動作したコードをメモとして残しておきます。
今回フィルタをかける対象URL
全記事データを取得する下記URLに、パラメータを追加してフィルタをかけていきます。
http://127.0.0.1:8000/api/post/
=> 全ての記事を取得
複数キーワードで「AND検索」
記事タイトルに「テスト」「記事」のどちらも含まれる記事を取得したい。
コード
from ..models import Post
from ..serializers import Post
from rest_framework.permissions import AllowAny
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
# AND検索用のカスタムフィルタ
class MultiValueCharFilterAnd(filters.CharFilter):
def filter(self, qs, value):
values = value.split(',') or []
for value in values:
qs = super(MultiValueCharFilterAnd, self).filter(qs, value)
return qs
# フィルタ
class PostFilter(filters.FilterSet):
title = MultiValueCharFilterAnd(field_name='title', lookup_expr='contains')
# ビュー
class PostListView(generics.ListAPIView):
queryset = Post.objects.all()
serializer_class = PostListSerializer
permission_classes = (AllowAny,)
filter_backends = (DjangoFilterBackend,)
filter_class = PostFilter # フィルタを指定
エンドポイント(URL)
http://127.0.0.1:8000/api/post/?title=テスト,記事
=> titleに「テスト」「記事」のどちらも含まれる記事を取得
複数キーワードで「OR検索」
記事タイトルに「テスト」「記事」のいずれか一つでも含まれる記事を取得したい。
コード
from ..models import Post
from ..serializers import Post
from rest_framework.permissions import AllowAny
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
import operator
from functools import reduce
from django.db.models import Q
# OR検索用のカスタムフィルタ
class MultiValueCharFilterOr(filters.CharFilter):
def filter(self, qs, value):
values = value.split(',') or []
expr = reduce(
operator.or_,
(Q(**{f'{self.field_name}__{self.lookup_expr}': v}) for v in values)
)
return qs.filter(expr)
# フィルタ
class PostFilter(filters.FilterSet):
title = MultiValueCharFilterOr(field_name='title', lookup_expr='contains')
# ビュー
class PostListView(generics.ListAPIView):
queryset = Post.objects.all()
serializer_class = PostListSerializer
permission_classes = (AllowAny,)
filter_backends = (DjangoFilterBackend,)
filter_class = PostFilter # フィルタを指定
エンドポイント(URL)
http://127.0.0.1:8000/api/post/?title=テスト,記事
=> titleに「テスト」または「記事」が含まれる記事を取得
最近の記事
音楽生成AI「Suno」の使い方まとめ!作詞作曲が簡単にできる?
簡単に曲が作れるAIということでよく聞く「Suno(Chirp)」についてまとめました。
目次「Suno」とはテキストからさまざまな音声を生成する「Bark」歌詞から曲を生成する「Chirp」...
2023/11/24
2023/11/24
【Open AI】APIの料金まとめ|GPT・DALL·E・Whisperなど
Open AIのAPI(一部)の料金をまとめました。
参考のために日本円は「1ドル150円」で換算をしています。
目次Text generation: テキスト生成Assistants ...
2023/11/22
2023/11/22
【Next.js】Assistants APIの基本的なコードまとめ。
Open AIの「Assistants API」をNext.jsで使用する時の基本的なコードをまとめました。
目次Open AIのAPIセットアップ基本の使い方Threads: スレッドを作る...
2023/11/21
2023/11/21
【Next.js】Open AIのAPIでファイルをアップロードする方法。
今回は、Next.jsサイトからOpen AIのAPI(Upload file)で、ファイルをアップロードする方法を実装するのに時間がかかったのでその過程と最終コードをまとめます。(Vercelにデ...
2023/11/21
2023/11/22
「生成系AIのWEBプロダクトTOP50」をまとめてみる。
Andreessen Horowitzが出している記事で紹介されている「AIプロダクトの月間訪問者数ランキングTOP50」のサービスをまとめました。
目次ChatGPTcharacter.ai...
2023/10/3
2023/10/3
【Next.js 13】NextAuth+FireStoreにユーザー情報を保存する。
今回は、以下の3つをNext.js 13で実装するためのメモです。
Googleアカウントでログインできる
アカウント、セッション情報をFirestoreに保存する
サーバーサイ...
2023/7/12
2023/7/12