99from . import advanced_types
1010from .utils import import_single_dispatch , get_field_description , get_query_fields
1111from concurrent .futures import ThreadPoolExecutor , as_completed
12+ from asgiref .sync import sync_to_async
1213
1314singledispatch = import_single_dispatch ()
1415
@@ -42,6 +43,14 @@ def convert_field_to_id(field, registry=None):
4243 )
4344
4445
46+ @convert_mongoengine_field .register (mongoengine .Decimal128Field )
47+ @convert_mongoengine_field .register (mongoengine .DecimalField )
48+ def convert_field_to_decimal (field , registry = None ):
49+ return graphene .Decimal (
50+ description = get_field_description (field , registry ), required = field .required
51+ )
52+
53+
4554@convert_mongoengine_field .register (mongoengine .IntField )
4655@convert_mongoengine_field .register (mongoengine .LongField )
4756@convert_mongoengine_field .register (mongoengine .SequenceField )
@@ -58,21 +67,13 @@ def convert_field_to_boolean(field, registry=None):
5867 )
5968
6069
61- @convert_mongoengine_field .register (mongoengine .DecimalField )
6270@convert_mongoengine_field .register (mongoengine .FloatField )
6371def convert_field_to_float (field , registry = None ):
6472 return graphene .Float (
6573 description = get_field_description (field , registry ), required = field .required
6674 )
6775
6876
69- @convert_mongoengine_field .register (mongoengine .Decimal128Field )
70- def convert_field_to_decimal (field , registry = None ):
71- return graphene .Decimal (
72- description = get_field_description (field , registry ), required = field .required
73- )
74-
75-
7677@convert_mongoengine_field .register (mongoengine .DateTimeField )
7778def convert_field_to_datetime (field , registry = None ):
7879 return graphene .DateTime (
@@ -246,7 +247,7 @@ def convert_field_to_union(field, registry=None):
246247 Meta = type ("Meta" , (object ,), {"types" : tuple (_types )})
247248 _union = type (name , (graphene .Union ,), {"Meta" : Meta })
248249
249- def reference_resolver (root , * args , ** kwargs ):
250+ async def reference_resolver (root , * args , ** kwargs ):
250251 de_referenced = getattr (root , field .name or field .db_name )
251252 if de_referenced :
252253 document = get_document (de_referenced ["_cls" ])
@@ -265,13 +266,14 @@ def reference_resolver(root, *args, **kwargs):
265266 item = to_snake_case (each )
266267 if item in document ._fields_ordered + tuple (filter_args ):
267268 queried_fields .append (item )
268- return document .objects ().no_dereference ().only (* list (
269- set (list (_type ._meta .required_fields ) + queried_fields ))).get (
270- pk = de_referenced ["_ref" ].id )
271- return document ()
269+ return await sync_to_async (document .objects ().no_dereference ().only (* list (
270+ set (list (_type ._meta .required_fields ) + queried_fields ))).get , thread_sensitive = False ,
271+ executor = ThreadPoolExecutor ())(pk = de_referenced ["_ref" ].id )
272+ return await sync_to_async (document , thread_sensitive = False ,
273+ executor = ThreadPoolExecutor ())()
272274 return None
273275
274- def lazy_reference_resolver (root , * args , ** kwargs ):
276+ async def lazy_reference_resolver (root , * args , ** kwargs ):
275277 document = getattr (root , field .name or field .db_name )
276278 if document :
277279 queried_fields = list ()
@@ -288,10 +290,11 @@ def lazy_reference_resolver(root, *args, **kwargs):
288290 if item in document .document_type ._fields_ordered + tuple (filter_args ):
289291 queried_fields .append (item )
290292 _type = registry .get_type_for_model (document .document_type )
291- return document .document_type .objects ().no_dereference ().only (
292- * (set ((list (_type ._meta .required_fields ) + queried_fields )))).get (
293- pk = document .pk )
294- return document .document_type ()
293+ return await sync_to_async (document .document_type .objects ().no_dereference ().only (
294+ * (set ((list (_type ._meta .required_fields ) + queried_fields )))).get , thread_sensitive = False ,
295+ executor = ThreadPoolExecutor ())(pk = document .pk )
296+ return await sync_to_async (document .document_type , thread_sensitive = False ,
297+ executor = ThreadPoolExecutor ())()
295298 return None
296299
297300 if isinstance (field , mongoengine .GenericLazyReferenceField ):
@@ -327,7 +330,7 @@ def lazy_reference_resolver(root, *args, **kwargs):
327330def convert_field_to_dynamic (field , registry = None ):
328331 model = field .document_type
329332
330- def reference_resolver (root , * args , ** kwargs ):
333+ async def reference_resolver (root , * args , ** kwargs ):
331334 document = getattr (root , field .name or field .db_name )
332335 if document :
333336 queried_fields = list ()
@@ -341,12 +344,12 @@ def reference_resolver(root, *args, **kwargs):
341344 item = to_snake_case (each )
342345 if item in field .document_type ._fields_ordered + tuple (filter_args ):
343346 queried_fields .append (item )
344- return field .document_type .objects ().no_dereference ().only (
345- * (set (list (_type ._meta .required_fields ) + queried_fields ))).get (
346- pk = document .id )
347+ return await sync_to_async ( field .document_type .objects ().no_dereference ().only (
348+ * (set (list (_type ._meta .required_fields ) + queried_fields ))).get , thread_sensitive = False ,
349+ executor = ThreadPoolExecutor ())( pk = document .id )
347350 return None
348351
349- def cached_reference_resolver (root , * args , ** kwargs ):
352+ async def cached_reference_resolver (root , * args , ** kwargs ):
350353 if field :
351354 queried_fields = list ()
352355 _type = registry .get_type_for_model (field .document_type )
@@ -359,9 +362,10 @@ def cached_reference_resolver(root, *args, **kwargs):
359362 item = to_snake_case (each )
360363 if item in field .document_type ._fields_ordered + tuple (filter_args ):
361364 queried_fields .append (item )
362- return field .document_type .objects ().no_dereference ().only (
365+ return await sync_to_async ( field .document_type .objects ().no_dereference ().only (
363366 * (set (
364- list (_type ._meta .required_fields ) + queried_fields ))).get (
367+ list (_type ._meta .required_fields ) + queried_fields ))).get , thread_sensitive = False ,
368+ executor = ThreadPoolExecutor ())(
365369 pk = getattr (root , field .name or field .db_name ))
366370 return None
367371
@@ -394,7 +398,7 @@ def dynamic_type():
394398def convert_lazy_field_to_dynamic (field , registry = None ):
395399 model = field .document_type
396400
397- def lazy_resolver (root , * args , ** kwargs ):
401+ async def lazy_resolver (root , * args , ** kwargs ):
398402 document = getattr (root , field .name or field .db_name )
399403 if document :
400404 queried_fields = list ()
@@ -408,9 +412,9 @@ def lazy_resolver(root, *args, **kwargs):
408412 item = to_snake_case (each )
409413 if item in document .document_type ._fields_ordered + tuple (filter_args ):
410414 queried_fields .append (item )
411- return document .document_type .objects ().no_dereference ().only (
412- * (set ((list (_type ._meta .required_fields ) + queried_fields )))).get (
413- pk = document .pk )
415+ return await sync_to_async ( document .document_type .objects ().no_dereference ().only (
416+ * (set ((list (_type ._meta .required_fields ) + queried_fields )))).get , thread_sensitive = False ,
417+ executor = ThreadPoolExecutor ())( pk = document .pk )
414418 return None
415419
416420 def dynamic_type ():
0 commit comments