9
9
from . import advanced_types
10
10
from .utils import import_single_dispatch , get_field_description , get_query_fields
11
11
from concurrent .futures import ThreadPoolExecutor , as_completed
12
+ from asgiref .sync import sync_to_async
12
13
13
14
singledispatch = import_single_dispatch ()
14
15
@@ -42,6 +43,14 @@ def convert_field_to_id(field, registry=None):
42
43
)
43
44
44
45
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
+
45
54
@convert_mongoengine_field .register (mongoengine .IntField )
46
55
@convert_mongoengine_field .register (mongoengine .LongField )
47
56
@convert_mongoengine_field .register (mongoengine .SequenceField )
@@ -58,21 +67,13 @@ def convert_field_to_boolean(field, registry=None):
58
67
)
59
68
60
69
61
- @convert_mongoengine_field .register (mongoengine .DecimalField )
62
70
@convert_mongoengine_field .register (mongoengine .FloatField )
63
71
def convert_field_to_float (field , registry = None ):
64
72
return graphene .Float (
65
73
description = get_field_description (field , registry ), required = field .required
66
74
)
67
75
68
76
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
-
76
77
@convert_mongoengine_field .register (mongoengine .DateTimeField )
77
78
def convert_field_to_datetime (field , registry = None ):
78
79
return graphene .DateTime (
@@ -246,7 +247,7 @@ def convert_field_to_union(field, registry=None):
246
247
Meta = type ("Meta" , (object ,), {"types" : tuple (_types )})
247
248
_union = type (name , (graphene .Union ,), {"Meta" : Meta })
248
249
249
- def reference_resolver (root , * args , ** kwargs ):
250
+ async def reference_resolver (root , * args , ** kwargs ):
250
251
de_referenced = getattr (root , field .name or field .db_name )
251
252
if de_referenced :
252
253
document = get_document (de_referenced ["_cls" ])
@@ -265,13 +266,14 @@ def reference_resolver(root, *args, **kwargs):
265
266
item = to_snake_case (each )
266
267
if item in document ._fields_ordered + tuple (filter_args ):
267
268
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 ())()
272
274
return None
273
275
274
- def lazy_reference_resolver (root , * args , ** kwargs ):
276
+ async def lazy_reference_resolver (root , * args , ** kwargs ):
275
277
document = getattr (root , field .name or field .db_name )
276
278
if document :
277
279
queried_fields = list ()
@@ -288,10 +290,11 @@ def lazy_reference_resolver(root, *args, **kwargs):
288
290
if item in document .document_type ._fields_ordered + tuple (filter_args ):
289
291
queried_fields .append (item )
290
292
_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 ())()
295
298
return None
296
299
297
300
if isinstance (field , mongoengine .GenericLazyReferenceField ):
@@ -327,7 +330,7 @@ def lazy_reference_resolver(root, *args, **kwargs):
327
330
def convert_field_to_dynamic (field , registry = None ):
328
331
model = field .document_type
329
332
330
- def reference_resolver (root , * args , ** kwargs ):
333
+ async def reference_resolver (root , * args , ** kwargs ):
331
334
document = getattr (root , field .name or field .db_name )
332
335
if document :
333
336
queried_fields = list ()
@@ -341,12 +344,12 @@ def reference_resolver(root, *args, **kwargs):
341
344
item = to_snake_case (each )
342
345
if item in field .document_type ._fields_ordered + tuple (filter_args ):
343
346
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 )
347
350
return None
348
351
349
- def cached_reference_resolver (root , * args , ** kwargs ):
352
+ async def cached_reference_resolver (root , * args , ** kwargs ):
350
353
if field :
351
354
queried_fields = list ()
352
355
_type = registry .get_type_for_model (field .document_type )
@@ -359,9 +362,10 @@ def cached_reference_resolver(root, *args, **kwargs):
359
362
item = to_snake_case (each )
360
363
if item in field .document_type ._fields_ordered + tuple (filter_args ):
361
364
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 (
363
366
* (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 ())(
365
369
pk = getattr (root , field .name or field .db_name ))
366
370
return None
367
371
@@ -394,7 +398,7 @@ def dynamic_type():
394
398
def convert_lazy_field_to_dynamic (field , registry = None ):
395
399
model = field .document_type
396
400
397
- def lazy_resolver (root , * args , ** kwargs ):
401
+ async def lazy_resolver (root , * args , ** kwargs ):
398
402
document = getattr (root , field .name or field .db_name )
399
403
if document :
400
404
queried_fields = list ()
@@ -408,9 +412,9 @@ def lazy_resolver(root, *args, **kwargs):
408
412
item = to_snake_case (each )
409
413
if item in document .document_type ._fields_ordered + tuple (filter_args ):
410
414
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 )
414
418
return None
415
419
416
420
def dynamic_type ():
0 commit comments