A custom argument in graphene-django
Asked Answered
C

1

6

How do I create a custom argument in GraphQL with graphene-django?

I currently have this configuration in my schema.py:

class Post(DjangoObjectType):
    class Meta:
        model = FeedPost
        interfaces = (graphene.relay.Node,)
        filter_fields = ['id']

class Query(graphene.ObjectType):
         post = graphene.Node.Field(Post)

    def resolve_post(self, info, **kwargs):
        username = kwargs.get('username')
        u = User.objects.get(username=username) 
        users_sources = FeedSource.objects.filter(user=u)
        return FeedPost.objects.filter(feed__feedsource__in=users_sources).annotate(
             source_title=F('feed__feedsource__title')
    )
schema = graphene.Schema(query=Query)

But I have not been able to figure out how to make "username" a required argument in the actual GraphQL query on "post".

Canica answered 23/11, 2018 at 22:11 Comment(1)
You have a choice of adding username as part of the Post input type, or as another separate argument to the query. Since you don't show your Post model, it's not clear if username is already part of it.Lanam
D
1

Not sure if this was supported before but i am using graphene-django>=2.15,<2.16 and i can confirm the following syntax works as expected:

class Query(graphene.ObjectType):

    # Notice the username argument
    post = graphene.Field(Post, username=graphene.String(required=True, default=None))

    def resolve_post(self, root, info, username): # Notice: the username argument spelled exactly as before
        u = User.objects.get(username=username) 
        users_sources = FeedSource.objects.filter(user=u)
        return FeedPost.objects.filter(feed__feedsource__in=users_sources).annotate(
             source_title=F('feed__feedsource__title')
    )

GraphiQL also deals with it properly: GraphiQL with argument

Dwain answered 31/10, 2021 at 9:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.