mirror of
https://github.com/graphql-python/graphene-django.git
synced 2024-11-10 19:57:15 +03:00
Fix custom foreignkey resolvers (#1361)
* Fix custom foreignkey resolvers * Fixed assert name conversion * Fix lint
This commit is contained in:
parent
ed7c995d8c
commit
f24cbd5148
|
@ -26,7 +26,13 @@ from graphene import (
|
||||||
from graphene.types.json import JSONString
|
from graphene.types.json import JSONString
|
||||||
from graphene.types.scalars import BigInt
|
from graphene.types.scalars import BigInt
|
||||||
from graphene.utils.str_converters import to_camel_case
|
from graphene.utils.str_converters import to_camel_case
|
||||||
from graphql import GraphQLError, assert_valid_name
|
from graphql import GraphQLError
|
||||||
|
|
||||||
|
try:
|
||||||
|
from graphql import assert_name
|
||||||
|
except ImportError:
|
||||||
|
# Support for older versions of graphql
|
||||||
|
from graphql import assert_valid_name as assert_name
|
||||||
from graphql.pyutils import register_description
|
from graphql.pyutils import register_description
|
||||||
|
|
||||||
from .compat import ArrayField, HStoreField, JSONField, PGJSONField, RangeField
|
from .compat import ArrayField, HStoreField, JSONField, PGJSONField, RangeField
|
||||||
|
@ -56,7 +62,7 @@ class BlankValueField(Field):
|
||||||
def convert_choice_name(name):
|
def convert_choice_name(name):
|
||||||
name = to_const(force_str(name))
|
name = to_const(force_str(name))
|
||||||
try:
|
try:
|
||||||
assert_valid_name(name)
|
assert_name(name)
|
||||||
except GraphQLError:
|
except GraphQLError:
|
||||||
name = "A_%s" % name
|
name = "A_%s" % name
|
||||||
return name
|
return name
|
||||||
|
@ -311,17 +317,19 @@ def convert_field_to_djangomodel(field, registry=None):
|
||||||
class CustomField(Field):
|
class CustomField(Field):
|
||||||
def wrap_resolve(self, parent_resolver):
|
def wrap_resolve(self, parent_resolver):
|
||||||
"""
|
"""
|
||||||
Implements a custom resolver which go through the `get_node` method to insure that
|
Implements a custom resolver which go through the `get_node` method to ensure that
|
||||||
it goes through the `get_queryset` method of the DjangoObjectType.
|
it goes through the `get_queryset` method of the DjangoObjectType.
|
||||||
"""
|
"""
|
||||||
resolver = super().wrap_resolve(parent_resolver)
|
resolver = super().wrap_resolve(parent_resolver)
|
||||||
|
|
||||||
def custom_resolver(root, info, **args):
|
def custom_resolver(root, info, **args):
|
||||||
fk_obj = resolver(root, info, **args)
|
fk_obj = resolver(root, info, **args)
|
||||||
if fk_obj is None:
|
if not isinstance(fk_obj, model):
|
||||||
return None
|
# In case the resolver is a custom one that overwrites
|
||||||
else:
|
# the default Django resolver
|
||||||
return _type.get_node(info, fk_obj.pk)
|
# This happens, for example, when using custom awaitable resolvers.
|
||||||
|
return fk_obj
|
||||||
|
return _type.get_node(info, fk_obj.pk)
|
||||||
|
|
||||||
return custom_resolver
|
return custom_resolver
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user