Skip to content

Commit 370f685

Browse files
committed
Support Django Connection resolving in an async context
1 parent a111ad3 commit 370f685

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

graphene_django/fields.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
offset_to_cursor,
1010
)
1111

12-
from promise import Promise
12+
from asgiref.sync import sync_to_async
13+
from asyncio import get_running_loop
1314

1415
from graphene import Int, NonNull
1516
from graphene.relay import ConnectionField
@@ -228,20 +229,43 @@ def connection_resolver(
228229

229230
# eventually leads to DjangoObjectType's get_queryset (accepts queryset)
230231
# or a resolve_foo (does not accept queryset)
232+
231233
iterable = resolver(root, info, **args)
234+
if info.is_awaitable(iterable):
235+
async def await_result():
236+
queryset_or_list = await iterable
237+
if queryset_or_list is None:
238+
queryset_or_list = default_manager
239+
240+
if is_async(queryset_resolver):
241+
242+
resolved = await sync_to_async(queryset_resolver)(connection, resolved, info, args)
243+
244+
# TODO: create an async_resolve_connection which uses the new Django queryset async functions
245+
async_resolve_connection = sync_to_async(cls.resolve_connection)
246+
247+
if is_awaitable(resolved):
248+
return async_resolve_connection(connection, args, await resolved, max_limit=max_limit)
249+
250+
return async_resolve_connection(connection, args, resolved, max_limit=max_limit)
251+
252+
return await_result()
253+
232254
if iterable is None:
233255
iterable = default_manager
234256
# thus the iterable gets refiltered by resolve_queryset
235257
# but iterable might be promise
236258
iterable = queryset_resolver(connection, iterable, info, args)
237-
on_resolve = partial(
238-
cls.resolve_connection, connection, args, max_limit=max_limit
239-
)
240259

241-
if Promise.is_thenable(iterable):
242-
return Promise.resolve(iterable).then(on_resolve)
260+
try:
261+
get_running_loop()
262+
except RuntimeError:
263+
pass
264+
else:
265+
return sync_to_async(cls.resolve_connection)(connection, args, iterable, max_limit=max_limit)
266+
243267

244-
return on_resolve(iterable)
268+
return cls.resolve_connection(connection, args, iterable, max_limit=max_limit)
245269

246270
def wrap_resolve(self, parent_resolver):
247271
return partial(

0 commit comments

Comments
 (0)