尝试使用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。

スクリーンショット 2022-07-20 0.16.06.png
スクリーンショット 2022-07-20 0.17.00.png

最后

如果您想了解更进一步的方法,我只整理了简单的实现,请参考官方文档。

下次我们将概述关于数据的添加、删除、编辑(变更)的实现。

bannerAds