@@ -261,8 +261,21 @@ def dynamic_type():
261261 _type = registry .get_type_for_model (model )
262262 if not _type :
263263 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 )
264275
265- return Field (_type , required = not field .null )
276+ return resolver
277+
278+ return CustomField (_type , required = not field .null )
266279
267280 return Dynamic (dynamic_type )
268281
@@ -324,13 +337,22 @@ def wrap_resolve(self, parent_resolver):
324337 it goes through the `get_queryset` method of the DjangoObjectType.
325338 """
326339 resolver = super ().wrap_resolve (parent_resolver )
327-
328340 try :
329341 get_running_loop ()
330342 except RuntimeError :
331343 pass
332344 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
334356
335357 def custom_resolver (root , info , ** args ):
336358 fk_obj = resolver (root , info , ** args )
0 commit comments