尝试使用Django和GraphQL Part.2(实现筛选功能)
首先
这是《在Django中尝试GraphQL Part.1》的续篇。
本次将进行筛选功能的实现。
因为在研究7月20日的带关系的版本时,发现可以更简单地实施筛选,所以追加了说明。对于那些通常不想麻烦地进行环境设置和编写的人,请参考我的git。
工作解释
Part1:针对初学者的环境设置和基本写作方法。
第二部分:目前,在GraphQL中实现没有关联的筛选。
第三部分:新增、删除、编辑(突变)数据的实施。
环境
请参考环境中的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。


最后
如果您想了解更进一步的方法,我只整理了简单的实现,请参考官方文档。
下次我们将概述关于数据的添加、删除、编辑(变更)的实现。