Skip to content

Commit 7296498

Browse files
Merge branch 'feat-retrieving-queried-fields-only' into feat-pagination-performance
# Conflicts: # graphene_mongo/converter.py
2 parents 1bad8e5 + 28cd0fd commit 7296498

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

graphene_mongo/converter.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ def reference_resolver(root, *args, **kwargs):
242242
querying_types = list(get_query_fields(args[0]).keys())
243243
if _type.__name__ in querying_types:
244244
queried_fields = list()
245-
for each in get_query_fields(args[0]).keys():
245+
for each in get_query_fields(args[0])[_type._meta.name].keys():
246246
item = to_snake_case(each)
247247
if item in document._fields_ordered + tuple(filter_args):
248248
queried_fields.append(item)
@@ -252,7 +252,42 @@ def reference_resolver(root, *args, **kwargs):
252252
return document
253253
return None
254254

255-
if isinstance(field, mongoengine.GenericReferenceField):
255+
def lazy_reference_resolver(root, *args, **kwargs):
256+
document = getattr(root, field.name or field.db_name)
257+
if document:
258+
queried_fields = list()
259+
document_field_type = registry.get_type_for_model(document.document_type)
260+
querying_types = list(get_query_fields(args[0]).keys())
261+
filter_args = list()
262+
if document_field_type._meta.filter_fields:
263+
for key, values in document_field_type._meta.filter_fields.items():
264+
for each in values:
265+
filter_args.append(key + "__" + each)
266+
if document_field_type._meta.name in querying_types:
267+
for each in get_query_fields(args[0])[document_field_type._meta.name].keys():
268+
item = to_snake_case(each)
269+
if item in document.document_type._fields_ordered + tuple(filter_args):
270+
queried_fields.append(item)
271+
_type = registry.get_type_for_model(document.document_type)
272+
return document.document_type.objects().no_dereference().only(
273+
*(set((list(_type._meta.required_fields) + queried_fields)))).get(
274+
pk=document.pk)
275+
return document.document_type()
276+
return None
277+
278+
if isinstance(field, mongoengine.GenericLazyReferenceField):
279+
field_resolver = None
280+
required = False
281+
if field.db_field is not None:
282+
required = field.required
283+
resolver_function = getattr(registry.get_type_for_model(field.owner_document), "resolve_" + field.db_field,
284+
None)
285+
if resolver_function and callable(resolver_function):
286+
field_resolver = resolver_function
287+
return graphene.Field(_union, resolver=field_resolver if field_resolver else lazy_reference_resolver,
288+
description=get_field_description(field, registry), required=required)
289+
290+
elif isinstance(field, mongoengine.GenericReferenceField):
256291
field_resolver = None
257292
required = False
258293
if field.db_field is not None:

0 commit comments

Comments
 (0)