@@ -112,7 +112,8 @@ def get_reference_objects(*args, **kwargs):
112
112
document_field = mongoengine .ReferenceField (document )
113
113
document_field = convert_mongoengine_field (document_field , registry )
114
114
document_field_type = document_field .get_type ().type ._meta .name
115
- only_fields = [to_snake_case (i ) for i in get_query_fields (args [0 ][3 ][0 ])[document_field_type ].keys ()]
115
+ only_fields = [to_snake_case (i ) for i in
116
+ get_query_fields (args [0 ][3 ][0 ])[document_field_type ].keys ()]
116
117
return document .objects ().no_dereference ().only (* only_fields ).filter (pk__in = args [0 ][1 ])
117
118
else :
118
119
return []
@@ -208,9 +209,12 @@ def reference_resolver(root, *args, **kwargs):
208
209
document = get_document (dereferenced ["_cls" ])
209
210
document_field = mongoengine .ReferenceField (document )
210
211
document_field = convert_mongoengine_field (document_field , registry )
211
- document_field_type = document_field .get_type ().type ._meta .name
212
- only_fields = [to_snake_case (i ) for i in get_query_fields (args [0 ])[document_field_type ].keys ()]
213
- return document .objects ().no_dereference ().only (* only_fields ).get (pk = dereferenced ["_ref" ].id )
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 )
214
218
215
219
if isinstance (field , mongoengine .GenericReferenceField ):
216
220
return graphene .Field (_union , resolver = reference_resolver ,
@@ -228,25 +232,21 @@ def convert_field_to_dynamic(field, registry=None):
228
232
def reference_resolver (root , * args , ** kwargs ):
229
233
document = getattr (root , field .name or field .db_name )
230
234
if document :
231
- only_fields = [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()]
232
- return field .document_type .objects ().no_dereference ().only (* only_fields ).get (pk = document .id )
235
+ _type = registry .get_type_for_model (field .document_type )
236
+ only_fields = _type ._meta .only_fields .split ("," ) if isinstance (_type ._meta .only_fields ,
237
+ str ) else list ()
238
+ return field .document_type .objects ().no_dereference ().only (
239
+ * ((list (set (only_fields + [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()])))
240
+ )).get (pk = document .id )
233
241
return None
234
242
235
- def cached_reference_resolver (root , * args , ** kwargs ):
236
- only_fields = [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()]
237
- return field .document_type .objects ().no_dereference ().only (* only_fields ).get (
238
- pk = getattr (root , field .name or field .db_name ))
239
-
240
243
def dynamic_type ():
241
244
_type = registry .get_type_for_model (model )
242
245
if not _type :
243
246
return None
244
- elif isinstance (field , mongoengine .ReferenceField ):
247
+ elif isinstance (field , mongoengine .ReferenceField ) or isinstance ( field , mongoengine . CachedReferenceField ) :
245
248
return graphene .Field (_type , resolver = reference_resolver ,
246
249
description = get_field_description (field , registry ))
247
- elif isinstance (field , mongoengine .CachedReferenceField ):
248
- return graphene .Field (_type , resolver = cached_reference_resolver ,
249
- description = get_field_description (field , registry ))
250
250
return graphene .Field (_type ,
251
251
description = get_field_description (field , registry ))
252
252
@@ -259,11 +259,16 @@ def convert_lazy_field_to_dynamic(field, registry=None):
259
259
260
260
def lazy_resolver (root , * args , ** kwargs ):
261
261
document = getattr (root , field .name or field .db_name )
262
- only_fields = [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()]
263
- return document .document_type .objects ().no_dereference ().only (* only_fields ).get (pk = document .pk )
262
+ _type = registry .get_type_for_model (document .document_type )
263
+ only_fields = _type ._meta .only_fields .split ("," ) if isinstance (_type ._meta .only_fields ,
264
+ str ) else list ()
265
+ return document .document_type .objects ().no_dereference ().only (
266
+ * (list (set ((only_fields + [to_snake_case (i ) for i in get_query_fields (args [0 ]).keys ()]))))).get (
267
+ pk = document .pk )
264
268
265
269
def dynamic_type ():
266
270
_type = registry .get_type_for_model (model )
271
+
267
272
if not _type :
268
273
return None
269
274
return graphene .Field (
0 commit comments