0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DjangoでGraphQLを触ってみる Part.2 (絞り込み実装)

Last updated at Posted at 2022-07-17

はじめに

DjangoでGraphQLを触ってみる Part.1の続きです。
今回は、絞り込みの実装を行います。

7/20にリレーションありのバージョンを調べる中でもっと簡単に絞り込みが実装できそうだったので追記しています。
いつも通り環境構築や書くのが面倒な方は、私のgitを参考にしてください。

パート解説

Part1 : 入門向け環境構築と基本的な書き方

Part2 : GraphQLでリレーションなしの絞り込み実装 ←イマココ

Part3 : データの追加、削除、編集(Mutation)の実装

環境

環境はPart.1を参照してください。

絞り込み実装

django-filterを利用しますので、requirements.txtに追記します。

requirements.txt
django-filter>2

djangoの設定でdjango-filterを利用するように設定します。

settings.py
INSTALLED_APPS = [
    ... 
    'django_filters' # ここを追記する
]

django-filtersの設定ができたら、schema.pyDjangoFilterConnectionFieldを追加します。

schema.py
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のものを絞り込みます。
スクリーンショット 2022-07-20 0.16.06.png

ちゃんと絞りこめていますね!リレーションのある絞り込みもdjango-filtersを使えば簡単に実装できることがわかりました。
スクリーンショット 2022-07-20 0.17.00.png

さいごに

簡単な実装のみまとめたのですが、もっと進んだ方法を知りたい場合は公式ドキュメントを参考にしましょう。

次回はデータの追加、削除、編集(Mutation)の実装についてまとめます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?