Skip to content

Prefetch_related in root resolver not preserved in children resolvers #327

Closed
@hgylfason

Description

@hgylfason

It seems that prefetch_related is not preserved in children resolvers. (select_related is no problem).

Example

This example is a simplified version of the code I am working with.

Models

class Family(models.Model):
    name = models.CharField(max_length=255)


class Person(models.Model):
    name = models.CharField(max_length=256)
    family = models.ForeignKey('Family', related_name='members')

Nodes

class PersonNode(DjangoObjectType):
    class Meta:
        model = Person
        interfaces = (graphene.relay.Node,)


class FamilyNode(DjangoObjectType):
    members = graphene.ConnectionField(PersonNode)

    class Meta:
        model = Family
        interfaces = (graphene.relay.Node,)

"Endpoint"

class Query(graphene.ObjectType):
    families = graphene.ConnectionField(Family)

    def resolve_families(self, args, context, info):
        qs = Family.objects.prefetch_related('members')
        return qs

Query

{
  families {
    edges {
      node {
        members {
          edges {
            node {
              name
            }
          }
        }
      }
    }
  }
}

Problem

The family members were prefetched in the root resolver but that is definitely not used in children resolvers as a db query is made for person data each time a family is resolved.

Question

Does anyone have an idea how to get prefetch_related used in children resolvers?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions