Skip to content

Commit b23cbe3

Browse files
authored
Merge pull request #165 from arunsureshkumar/bug-fix-feat-retrieving-queried-fields-only
Bug fix feat retrieving queried fields only
2 parents bc5f0c6 + fc942bf commit b23cbe3

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

graphene_mongo/converter.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from graphene.types.json import JSONString
66
from graphene.utils.str_converters import to_snake_case
7-
from mongoengine.base import get_document
7+
from mongoengine.base import get_document, LazyReference
88
from . import advanced_types
99
from .utils import import_single_dispatch, get_field_description, get_query_fields
1010
from concurrent.futures import ThreadPoolExecutor, as_completed
@@ -138,10 +138,19 @@ def reference_resolver(root, *args, **kwargs):
138138
to_resolve_models = list()
139139
for each in querying_union_types:
140140
to_resolve_models.append(registry._registry_string_map[each])
141+
to_resolve_object_ids = list()
141142
for each in to_resolve:
142-
if each['_cls'] not in choice_to_resolve:
143-
choice_to_resolve[each['_cls']] = list()
144-
choice_to_resolve[each['_cls']].append(each["_ref"].id)
143+
if isinstance(each, LazyReference):
144+
to_resolve_object_ids.append(each.pk)
145+
model = each.document_type._class_name
146+
if model not in choice_to_resolve:
147+
choice_to_resolve[model] = list()
148+
choice_to_resolve[model].append(each.pk)
149+
else:
150+
to_resolve_object_ids.append(each["_ref"].id)
151+
if each['_cls'] not in choice_to_resolve:
152+
choice_to_resolve[each['_cls']] = list()
153+
choice_to_resolve[each['_cls']].append(each["_ref"].id)
145154
pool = ThreadPoolExecutor(5)
146155
futures = list()
147156
for model, object_id_list in choice_to_resolve.items():
@@ -153,7 +162,6 @@ def reference_resolver(root, *args, **kwargs):
153162
result = list()
154163
for x in as_completed(futures):
155164
result += x.result()
156-
to_resolve_object_ids = [each["_ref"].id for each in to_resolve]
157165
result_object_ids = list()
158166
for each in result:
159167
result_object_ids.append(each.id)
@@ -249,7 +257,7 @@ def reference_resolver(root, *args, **kwargs):
249257
return document.objects().no_dereference().only(*list(
250258
set(list(_type._meta.required_fields) + queried_fields))).get(
251259
pk=de_referenced["_ref"].id)
252-
return document
260+
return document()
253261
return None
254262

255263
def lazy_reference_resolver(root, *args, **kwargs):

graphene_mongo/fields.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,6 @@ def get_queryset(self, model, info, required_fields=list(), skip=None, limit=Non
232232
args.update(queryset_or_filters)
233233
if limit is not None:
234234
if reversed:
235-
order_by = ""
236235
if self.order_by:
237236
order_by = self.order_by + ",-pk"
238237
else:
@@ -244,7 +243,6 @@ def get_queryset(self, model, info, required_fields=list(), skip=None, limit=Non
244243
skip if skip else 0).limit(limit)
245244
elif skip is not None:
246245
if reversed:
247-
order_by = ""
248246
if self.order_by:
249247
order_by = self.order_by + ",-pk"
250248
else:
@@ -260,10 +258,13 @@ def default_resolver(self, _root, info, required_fields=list(), **args):
260258
args = args or {}
261259
if _root is not None:
262260
field_name = to_snake_case(info.field_name)
263-
if field_name in _root._fields_ordered and not (isinstance(_root._fields[field_name].field,
264-
mongoengine.EmbeddedDocumentField) or
265-
isinstance(_root._fields[field_name].field,
266-
mongoengine.GenericEmbeddedDocumentField)):
261+
if not hasattr(_root, "_fields_ordered"):
262+
if getattr(_root, field_name, []) is not None:
263+
args["pk__in"] = [r.id for r in getattr(_root, field_name, [])]
264+
elif field_name in _root._fields_ordered and not (isinstance(_root._fields[field_name].field,
265+
mongoengine.EmbeddedDocumentField) or
266+
isinstance(_root._fields[field_name].field,
267+
mongoengine.GenericEmbeddedDocumentField)):
267268
if getattr(_root, field_name, []) is not None:
268269
args["pk__in"] = [r.id for r in getattr(_root, field_name, [])]
269270

@@ -351,10 +352,10 @@ def chained_resolver(self, resolver, is_partial, root, info, **args):
351352
for field in get_query_fields(info):
352353
if to_snake_case(field) in self.model._fields_ordered:
353354
required_fields.append(to_snake_case(field))
355+
args_copy = args.copy()
354356
if not bool(args) or not is_partial:
355357
if isinstance(self.model, mongoengine.Document) or isinstance(self.model,
356358
mongoengine.base.metaclasses.TopLevelDocumentMetaclass):
357-
args_copy = args.copy()
358359
for arg_name, arg in args.copy().items():
359360
if arg_name not in self.model._fields_ordered + tuple(self.filter_args.keys()):
360361
args_copy.pop(arg_name)
@@ -370,13 +371,17 @@ def chained_resolver(self, resolver, is_partial, root, info, **args):
370371
return resolved
371372
elif not isinstance(resolved[0], DBRef):
372373
return resolved
374+
else:
375+
return self.default_resolver(root, info, required_fields, **args_copy)
373376
elif isinstance(resolved, QuerySet):
374377
args.update(resolved._query)
375378
args_copy = args.copy()
376379
for arg_name, arg in args.copy().items():
377380
if arg_name not in self.model._fields_ordered + ('first', 'last', 'before', 'after') + tuple(
378381
self.filter_args.keys()):
379382
args_copy.pop(arg_name)
383+
if arg_name == '_id' and isinstance(arg, dict):
384+
args_copy['pk__in'] = arg['$in']
380385
if '.' in arg_name:
381386
operation = list(arg.keys())[0]
382387
args_copy[arg_name.replace('.', '__') + operation.replace('$', '__')] = arg[operation]

0 commit comments

Comments
 (0)