@@ -232,7 +232,6 @@ def get_queryset(self, model, info, required_fields=list(), skip=None, limit=Non
232
232
args .update (queryset_or_filters )
233
233
if limit is not None :
234
234
if reversed :
235
- order_by = ""
236
235
if self .order_by :
237
236
order_by = self .order_by + ",-pk"
238
237
else :
@@ -244,7 +243,6 @@ def get_queryset(self, model, info, required_fields=list(), skip=None, limit=Non
244
243
skip if skip else 0 ).limit (limit )
245
244
elif skip is not None :
246
245
if reversed :
247
- order_by = ""
248
246
if self .order_by :
249
247
order_by = self .order_by + ",-pk"
250
248
else :
@@ -260,10 +258,13 @@ def default_resolver(self, _root, info, required_fields=list(), **args):
260
258
args = args or {}
261
259
if _root is not None :
262
260
field_name = to_snake_case (info .field_name )
263
- if field_name in _root ._fields_ordered and not (isinstance (_root ._fields [field_name ].field ,
264
- mongoengine .EmbeddedDocumentField ) or
265
- isinstance (_root ._fields [field_name ].field ,
266
- mongoengine .GenericEmbeddedDocumentField )):
261
+ if not hasattr (_root , "_fields_ordered" ):
262
+ if getattr (_root , field_name , []) is not None :
263
+ args ["pk__in" ] = [r .id for r in getattr (_root , field_name , [])]
264
+ elif field_name in _root ._fields_ordered and not (isinstance (_root ._fields [field_name ].field ,
265
+ mongoengine .EmbeddedDocumentField ) or
266
+ isinstance (_root ._fields [field_name ].field ,
267
+ mongoengine .GenericEmbeddedDocumentField )):
267
268
if getattr (_root , field_name , []) is not None :
268
269
args ["pk__in" ] = [r .id for r in getattr (_root , field_name , [])]
269
270
@@ -351,10 +352,10 @@ def chained_resolver(self, resolver, is_partial, root, info, **args):
351
352
for field in get_query_fields (info ):
352
353
if to_snake_case (field ) in self .model ._fields_ordered :
353
354
required_fields .append (to_snake_case (field ))
355
+ args_copy = args .copy ()
354
356
if not bool (args ) or not is_partial :
355
357
if isinstance (self .model , mongoengine .Document ) or isinstance (self .model ,
356
358
mongoengine .base .metaclasses .TopLevelDocumentMetaclass ):
357
- args_copy = args .copy ()
358
359
for arg_name , arg in args .copy ().items ():
359
360
if arg_name not in self .model ._fields_ordered + tuple (self .filter_args .keys ()):
360
361
args_copy .pop (arg_name )
@@ -370,13 +371,17 @@ def chained_resolver(self, resolver, is_partial, root, info, **args):
370
371
return resolved
371
372
elif not isinstance (resolved [0 ], DBRef ):
372
373
return resolved
374
+ else :
375
+ return self .default_resolver (root , info , required_fields , ** args_copy )
373
376
elif isinstance (resolved , QuerySet ):
374
377
args .update (resolved ._query )
375
378
args_copy = args .copy ()
376
379
for arg_name , arg in args .copy ().items ():
377
380
if arg_name not in self .model ._fields_ordered + ('first' , 'last' , 'before' , 'after' ) + tuple (
378
381
self .filter_args .keys ()):
379
382
args_copy .pop (arg_name )
383
+ if arg_name == '_id' and isinstance (arg , dict ):
384
+ args_copy ['pk__in' ] = arg ['$in' ]
380
385
if '.' in arg_name :
381
386
operation = list (arg .keys ())[0 ]
382
387
args_copy [arg_name .replace ('.' , '__' ) + operation .replace ('$' , '__' )] = arg [operation ]
0 commit comments