@@ -261,8 +261,21 @@ def dynamic_type():
261
261
_type = registry .get_type_for_model (model )
262
262
if not _type :
263
263
return
264
+
265
+ class CustomField (Field ):
266
+ def wrap_resolve (self , parent_resolver ):
267
+ resolver = super ().wrap_resolve (parent_resolver )
268
+
269
+ try :
270
+ get_running_loop ()
271
+ except RuntimeError :
272
+ pass
273
+ else :
274
+ resolver = sync_to_async (resolver )
264
275
265
- return Field (_type , required = not field .null )
276
+ return resolver
277
+
278
+ return CustomField (_type , required = not field .null )
266
279
267
280
return Dynamic (dynamic_type )
268
281
@@ -324,13 +337,22 @@ def wrap_resolve(self, parent_resolver):
324
337
it goes through the `get_queryset` method of the DjangoObjectType.
325
338
"""
326
339
resolver = super ().wrap_resolve (parent_resolver )
327
-
328
340
try :
329
341
get_running_loop ()
330
342
except RuntimeError :
331
343
pass
332
344
else :
333
- resolver = sync_to_async (resolver )
345
+ async def custom_resolver (root , info , ** args ):
346
+ fk_obj = await sync_to_async (resolver )(root , info , ** args )
347
+ if not isinstance (fk_obj , model ):
348
+ # In case the resolver is a custom one that overwrites
349
+ # the default Django resolver
350
+ # This happens, for example, when using custom awaitable resolvers.
351
+ return fk_obj
352
+ ## This fucks shit up I do believe
353
+ return await sync_to_async (_type .get_node )(info , fk_obj .pk )
354
+
355
+ return custom_resolver
334
356
335
357
def custom_resolver (root , info , ** args ):
336
358
fk_obj = resolver (root , info , ** args )
0 commit comments