Home > OS >  Django query resolver for a specific field (graphql)
Django query resolver for a specific field (graphql)

Time:01-19

I want to make a query that only displays variant_view_configuration field. How can I solve the problem? If I write like that (return User.objects.get(pk=instance.id).variant_view_configuration), it gives me an error - but I need only variant_view_configuration

class User(AbstractUser):
    variant_view_configuration = ArrayField(models.CharField(max_length=200), default=list, blank=True)

class UserQueries(object):
    user_variant_view_preference = graphene.Field(UserNode, id=graphene.ID(required=True))

    def resolve_user_variant_view_preference(self, info, id):
        instance = Node.get_node_from_global_id(info, id, only_type=UserNode)
        if not instance:
            raise ApplicationError.general.not_found(id)

        return User.objects.get(pk=instance.id).variant_view_configuration

The GraphQL query:

QUERY = """
    query Test($id: ID!) {
        userVariantViewPreference(id: $id) {
            variantViewConfiguration
        }
    }
"""


def test_user_variant_preference(graphql_request_maker):
    user = User.objects.create(
        username='username12',
        email='[email protected]',
        variant_view_configuration=["colors[0].sizes[0].size", "details.country_of_origin"]
    )

    data, err = graphql_request_maker.make(
        QUERY,
        {
            "id": to_global_id('UserNode', user.id)
        }
    )

So, as I say, I want a query that return only and only variant_view_configuration for a specific User id.

I am new to django and graphql, please explain how I do this. Thank you!

CodePudding user response:

I will suggest that you filter through the instance.id and not get the instance id. So a good practice would be this:

class User(AbstractUser):
    variant_view_configuration = ArrayField(models.CharField(max_length=200), default=list, blank=True)

class UserQueries(object):
    user_variant_view_preference = graphene.Field(UserNode, id=graphene.ID(required=True))

    def resolve_user_variant_view_preference(self, info, id):
        instance = Node.get_node_from_global_id(info, id, only_type=UserNode)
        if not instance:
            raise ApplicationError.general.not_found(id)

        return User.objects.filter(pk=instance.id).only('variant_view_configuration')

CodePudding user response:

You should change the resolver type from UserNode to graphene.List(graphene.String):

class User(AbstractUser):
    variant_view_configuration = ArrayField(models.CharField(max_length=200), default=list, blank=True)

class UserQueries(object):
    user_variant_view_preference = graphene.List(graphene.String, id=graphene.ID(required=True))

    def resolve_user_variant_view_preference(self, info, id):
        instance = Node.get_node_from_global_id(info, id, only_type=UserNode)
        if not instance:
            raise ApplicationError.general.not_found(id)

        return User.objects.get(pk=instance.id).variant_view_configuration
  •  Tags:  
  • Related