@@ -113,7 +113,7 @@ def get_reference_objects(*args, **kwargs):
113
113
document_field = convert_mongoengine_field (document_field , registry )
114
114
document_field_type = document_field .get_type ().type ._meta .name
115
115
required_fields = [to_snake_case (i ) for i in
116
- get_query_fields (args [0 ][3 ][0 ])[document_field_type ].keys ()]
116
+ get_query_fields (args [0 ][3 ][0 ])[document_field_type ].keys ()]
117
117
return document .objects ().no_dereference ().only (* required_fields ).filter (pk__in = args [0 ][1 ])
118
118
else :
119
119
return []
@@ -221,7 +221,12 @@ def reference_resolver(root, *args, **kwargs):
221
221
return None
222
222
223
223
if isinstance (field , mongoengine .GenericReferenceField ):
224
- return graphene .Field (_union , resolver = reference_resolver ,
224
+ field_resolver = None
225
+ if field .db_field is not None :
226
+ resolver_function = getattr (_union , "resolve_" + field .db_field , None )
227
+ if resolver_function and callable (resolver_function ):
228
+ field_resolver = resolver_function
229
+ return graphene .Field (_union , resolver = field_resolver if field_resolver else reference_resolver ,
225
230
description = get_field_description (field , registry ))
226
231
227
232
return graphene .Field (_union )
@@ -238,7 +243,7 @@ def reference_resolver(root, *args, **kwargs):
238
243
if document :
239
244
_type = registry .get_type_for_model (field .document_type )
240
245
required_fields = _type ._meta .required_fields .split ("," ) if isinstance (_type ._meta .required_fields ,
241
- str ) else list ()
246
+ str ) else list ()
242
247
return field .document_type .objects ().no_dereference ().only (
243
248
* ((list (set (required_fields + [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()]))))).get (
244
249
pk = document .id )
@@ -248,7 +253,7 @@ def cached_reference_resolver(root, *args, **kwargs):
248
253
if field :
249
254
_type = registry .get_type_for_model (field .document_type )
250
255
required_fields = _type ._meta .required_fields .split ("," ) if isinstance (_type ._meta .required_fields ,
251
- str ) else list ()
256
+ str ) else list ()
252
257
return field .document_type .objects ().no_dereference ().only (
253
258
* (list (set (required_fields + [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()]))
254
259
)).get (
@@ -259,14 +264,20 @@ def dynamic_type():
259
264
_type = registry .get_type_for_model (model )
260
265
if not _type :
261
266
return None
262
- elif isinstance (field , mongoengine .ReferenceField ):
263
- return graphene .Field (_type , resolver = reference_resolver ,
267
+ if isinstance (field , mongoengine .EmbeddedDocumentField ):
268
+ return graphene .Field (_type ,
264
269
description = get_field_description (field , registry ))
265
- elif isinstance (field , mongoengine .CachedReferenceField ):
266
- return graphene .Field (_type , resolver = cached_reference_resolver ,
270
+ field_resolver = None
271
+ if field .db_field is not None :
272
+ resolver_function = getattr (_type , "resolve_" + field .db_field , None )
273
+ if resolver_function and callable (resolver_function ):
274
+ field_resolver = resolver_function
275
+ if isinstance (field , mongoengine .ReferenceField ):
276
+ return graphene .Field (_type , resolver = field_resolver if field_resolver else reference_resolver ,
277
+ description = get_field_description (field , registry ))
278
+ else :
279
+ return graphene .Field (_type , resolver = field_resolver if field_resolver else cached_reference_resolver (),
267
280
description = get_field_description (field , registry ))
268
- return graphene .Field (_type ,
269
- description = get_field_description (field , registry ))
270
281
271
282
return graphene .Dynamic (dynamic_type )
272
283
@@ -280,20 +291,24 @@ def lazy_resolver(root, *args, **kwargs):
280
291
if document :
281
292
_type = registry .get_type_for_model (document .document_type )
282
293
required_fields = _type ._meta .required_fields .split ("," ) if isinstance (_type ._meta .required_fields ,
283
- str ) else list ()
294
+ str ) else list ()
284
295
return document .document_type .objects ().no_dereference ().only (
285
296
* (list (set ((required_fields + [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()]))))).get (
286
297
pk = document .pk )
287
298
return None
288
299
289
300
def dynamic_type ():
290
301
_type = registry .get_type_for_model (model )
291
-
292
302
if not _type :
293
303
return None
304
+ field_resolver = None
305
+ if field .db_field is not None :
306
+ resolver_function = getattr (_type , "resolve_" + field .db_field , None )
307
+ if resolver_function and callable (resolver_function ):
308
+ field_resolver = resolver_function
294
309
return graphene .Field (
295
310
_type ,
296
- resolver = lazy_resolver ,
311
+ resolver = field_resolver if field_resolver else lazy_resolver ,
297
312
description = get_field_description (field , registry ),
298
313
)
299
314
0 commit comments