@@ -242,7 +242,7 @@ def reference_resolver(root, *args, **kwargs):
242
242
querying_types = list (get_query_fields (args [0 ]).keys ())
243
243
if _type .__name__ in querying_types :
244
244
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 ():
246
246
item = to_snake_case (each )
247
247
if item in document ._fields_ordered + tuple (filter_args ):
248
248
queried_fields .append (item )
@@ -252,7 +252,42 @@ def reference_resolver(root, *args, **kwargs):
252
252
return document
253
253
return None
254
254
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 ):
256
291
field_resolver = None
257
292
required = False
258
293
if field .db_field is not None :
0 commit comments