@@ -121,24 +121,26 @@ def get_reference_objects(*args, **kwargs):
121
121
def reference_resolver (root , * args , ** kwargs ):
122
122
choice_to_resolve = dict ()
123
123
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 []
142
144
143
145
return graphene .List (
144
146
base_type ._type ,
@@ -206,15 +208,17 @@ def convert_field_to_union(field, registry=None):
206
208
207
209
def reference_resolver (root , * args , ** kwargs ):
208
210
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
218
222
219
223
if isinstance (field , mongoengine .GenericReferenceField ):
220
224
return graphene .Field (_union , resolver = reference_resolver ,
@@ -241,13 +245,15 @@ def reference_resolver(root, *args, **kwargs):
241
245
return None
242
246
243
247
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
251
257
252
258
def dynamic_type ():
253
259
_type = registry .get_type_for_model (model )
@@ -271,12 +277,14 @@ def convert_lazy_field_to_dynamic(field, registry=None):
271
277
272
278
def lazy_resolver (root , * args , ** kwargs ):
273
279
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
280
288
281
289
def dynamic_type ():
282
290
_type = registry .get_type_for_model (model )
0 commit comments