はじめに
DjangoでGraphQLを触ってみる Part.1の続きです。
今回は、絞り込みの実装を行います。
7/20にリレーションありのバージョンを調べる中でもっと簡単に絞り込みが実装できそうだったので追記しています。
いつも通り環境構築や書くのが面倒な方は、私のgitを参考にしてください。
パート解説
Part1 : 入門向け環境構築と基本的な書き方
Part2 : GraphQLでリレーションなしの絞り込み実装 ←イマココ
Part3 : データの追加、削除、編集(Mutation)の実装
環境
環境はPart.1を参照してください。
絞り込み実装
django-filter
を利用しますので、requirements.txt
に追記します。
django-filter>2
djangoの設定でdjango-filterを利用するように設定します。
INSTALLED_APPS = [
...
'django_filters' # ここを追記する
]
django-filtersの設定ができたら、schema.py
にDjangoFilterConnectionField
を追加します。
import graphene
from graphene import relay
from graphene_django import DjangoObjectType
# フィルタ機能を実装するためimportする
from graphene_django.filter import DjangoFilterConnectionField
from graphql_sample.models import User, Item
class UserType(DjangoObjectType):
class Meta:
model = User
# フィルタするカラムをここで指定する
filter_fields = ['username']
interfaces = (relay.Node,)
class ItemType(DjangoObjectType):
class Meta:
model = Item
# フィルタするカラムをここで指定する
# リレーション先のカラムを指定したい場合はアンダーバー二つで指定する
filter_fields = ['name', 'description', 'brand', 'user__username']
interfaces = (relay.Node,)
class Query(graphene.ObjectType):
user = graphene.List(UserType, id=graphene.Int())
item = graphene.List(ItemType, id=graphene.Int())
# 以下のコードを追加するだけでフィルタができる
all_user = DjangoFilterConnectionField(UserType)
all_item = DjangoFilterConnectionField(ItemType)
def resolve_user(self, info, **kwargs):
return User.objects.all()
def resolve_item(self, info, **kwargs):
return Item.objects.all()
schema = graphene.Schema(query=Query)
追加ができたらコンテナを立ち上げ、localhost:8000/graphqlにアクセスします。
まずは、brand
がちゃんと絞りこめているか確認できたら、次はGoogleブランドかつ、username
がabemaruのものを絞り込みます。
ちゃんと絞りこめていますね!リレーションのある絞り込みもdjango-filters
を使えば簡単に実装できることがわかりました。
さいごに
簡単な実装のみまとめたのですが、もっと進んだ方法を知りたい場合は公式ドキュメントを参考にしましょう。
次回はデータの追加、削除、編集(Mutation)の実装についてまとめます。