Skip to content

Commit 6981bfe

Browse files
Arun S KumarArun S Kumar
authored andcommitted
Implemented None Check for all type of reference and list of reference field.
1 parent d42a224 commit 6981bfe

File tree

1 file changed

+48
-40
lines changed

1 file changed

+48
-40
lines changed

graphene_mongo/converter.py

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -121,24 +121,26 @@ def get_reference_objects(*args, **kwargs):
121121
def reference_resolver(root, *args, **kwargs):
122122
choice_to_resolve = dict()
123123
to_resolve = getattr(root, field.name or field.db_name)
124-
for each in to_resolve:
125-
if each['_cls'] not in choice_to_resolve:
126-
choice_to_resolve[each['_cls']] = list()
127-
choice_to_resolve[each['_cls']].append(each["_ref"].id)
128-
129-
pool = ThreadPoolExecutor(5)
130-
futures = list()
131-
for model, object_id_list in choice_to_resolve.items():
132-
futures.append(pool.submit(get_reference_objects, (model, object_id_list, registry, args)))
133-
result = list()
134-
for x in as_completed(futures):
135-
result += x.result()
136-
to_resolve_object_ids = [each["_ref"].id for each in to_resolve]
137-
result_to_resolve_object_ids = [each.id for each in result]
138-
ordered_result = list()
139-
for each in to_resolve_object_ids:
140-
ordered_result.append(result[result_to_resolve_object_ids.index(each)])
141-
return ordered_result
124+
if to_resolve:
125+
for each in to_resolve:
126+
if each['_cls'] not in choice_to_resolve:
127+
choice_to_resolve[each['_cls']] = list()
128+
choice_to_resolve[each['_cls']].append(each["_ref"].id)
129+
130+
pool = ThreadPoolExecutor(5)
131+
futures = list()
132+
for model, object_id_list in choice_to_resolve.items():
133+
futures.append(pool.submit(get_reference_objects, (model, object_id_list, registry, args)))
134+
result = list()
135+
for x in as_completed(futures):
136+
result += x.result()
137+
to_resolve_object_ids = [each["_ref"].id for each in to_resolve]
138+
result_to_resolve_object_ids = [each.id for each in result]
139+
ordered_result = list()
140+
for each in to_resolve_object_ids:
141+
ordered_result.append(result[result_to_resolve_object_ids.index(each)])
142+
return ordered_result
143+
return []
142144

143145
return graphene.List(
144146
base_type._type,
@@ -206,15 +208,17 @@ def convert_field_to_union(field, registry=None):
206208

207209
def reference_resolver(root, *args, **kwargs):
208210
dereferenced = getattr(root, field.name or field.db_name)
209-
document = get_document(dereferenced["_cls"])
210-
document_field = mongoengine.ReferenceField(document)
211-
document_field = convert_mongoengine_field(document_field, registry)
212-
_type = document_field.get_type().type
213-
only_fields = _type._meta.only_fields.split(",") if isinstance(_type._meta.only_fields,
214-
str) else list()
215-
return document.objects().no_dereference().only(*list(
216-
set(only_fields + [to_snake_case(i) for i in get_query_fields(args[0])[_type._meta.name].keys()]))).get(
217-
pk=dereferenced["_ref"].id)
211+
if dereferenced:
212+
document = get_document(dereferenced["_cls"])
213+
document_field = mongoengine.ReferenceField(document)
214+
document_field = convert_mongoengine_field(document_field, registry)
215+
_type = document_field.get_type().type
216+
only_fields = _type._meta.only_fields.split(",") if isinstance(_type._meta.only_fields,
217+
str) else list()
218+
return document.objects().no_dereference().only(*list(
219+
set(only_fields + [to_snake_case(i) for i in get_query_fields(args[0])[_type._meta.name].keys()]))).get(
220+
pk=dereferenced["_ref"].id)
221+
return None
218222

219223
if isinstance(field, mongoengine.GenericReferenceField):
220224
return graphene.Field(_union, resolver=reference_resolver,
@@ -241,13 +245,15 @@ def reference_resolver(root, *args, **kwargs):
241245
return None
242246

243247
def cached_reference_resolver(root, *args, **kwargs):
244-
_type = registry.get_type_for_model(field.document_type)
245-
only_fields = _type._meta.only_fields.split(",") if isinstance(_type._meta.only_fields,
246-
str) else list()
247-
return field.document_type.objects().no_dereference().only(
248-
*(list(set(only_fields + [to_snake_case(i) for i in get_query_fields(args[0]).keys()]))
249-
)).get(
250-
pk=getattr(root, field.name or field.db_name))
248+
if field:
249+
_type = registry.get_type_for_model(field.document_type)
250+
only_fields = _type._meta.only_fields.split(",") if isinstance(_type._meta.only_fields,
251+
str) else list()
252+
return field.document_type.objects().no_dereference().only(
253+
*(list(set(only_fields + [to_snake_case(i) for i in get_query_fields(args[0]).keys()]))
254+
)).get(
255+
pk=getattr(root, field.name or field.db_name))
256+
return None
251257

252258
def dynamic_type():
253259
_type = registry.get_type_for_model(model)
@@ -271,12 +277,14 @@ def convert_lazy_field_to_dynamic(field, registry=None):
271277

272278
def lazy_resolver(root, *args, **kwargs):
273279
document = getattr(root, field.name or field.db_name)
274-
_type = registry.get_type_for_model(document.document_type)
275-
only_fields = _type._meta.only_fields.split(",") if isinstance(_type._meta.only_fields,
276-
str) else list()
277-
return document.document_type.objects().no_dereference().only(
278-
*(list(set((only_fields + [to_snake_case(i) for i in get_query_fields(args[0]).keys()]))))).get(
279-
pk=document.pk)
280+
if document:
281+
_type = registry.get_type_for_model(document.document_type)
282+
only_fields = _type._meta.only_fields.split(",") if isinstance(_type._meta.only_fields,
283+
str) else list()
284+
return document.document_type.objects().no_dereference().only(
285+
*(list(set((only_fields + [to_snake_case(i) for i in get_query_fields(args[0]).keys()]))))).get(
286+
pk=document.pk)
287+
return None
280288

281289
def dynamic_type():
282290
_type = registry.get_type_for_model(model)

0 commit comments

Comments
 (0)