Add DataLoaderField

This commit is contained in:
Olivia Rodriguez Valdes 2019-04-10 11:28:33 -04:00
parent 200353d014
commit ee50031cf6

View File

@ -1,13 +1,11 @@
from functools import partial from functools import partial
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from promise import Promise
from graphene.types import Field, List from graphene.types import Field, List
from graphene.relay import ConnectionField, PageInfo from graphene.relay import ConnectionField, PageInfo
from graphene.utils.get_unbound_function import get_unbound_function from graphene.utils.get_unbound_function import get_unbound_function
from graphql_relay.connection.arrayconnection import connection_from_list_slice from graphql_relay.connection.arrayconnection import connection_from_list_slice
from promise import Promise
from .settings import graphene_settings from .settings import graphene_settings
from .utils import maybe_queryset, auth_resolver from .utils import maybe_queryset, auth_resolver
@ -170,3 +168,27 @@ class DjangoField(Field):
return partial(get_unbound_function(self.permissions_resolver), parent_resolver, self.permissions, None, return partial(get_unbound_function(self.permissions_resolver), parent_resolver, self.permissions, None,
None, True) None, True)
return parent_resolver return parent_resolver
class DataLoaderField(DjangoField):
"""Class to manage access to dataloader when resolve the field"""
def __init__(self, data_loader, source_loader, type, *args, **kwargs):
"""
Initialization of dataloader to resolve field
:param data_loader: dataloader to resolve field
:param source_loader: field to obtain the key for dataloading
:param kwargs: Extra arguments
"""
self.data_loader = data_loader
self.source_loader = source_loader
super(DataLoaderField, self).__init__(type, *args, **kwargs)
# If no resolver is explicitly provided, use dataloader
self.resolver = self.resolver or self.resolver_data_loader
def resolver_data_loader(self, root, info, *args):
"""Resolve field through dataloader"""
source_loader = getattr(root, self.source_loader)
return self.data_loader.load(source_loader)