ObjectType.resolve_type classmethod makes it impossible to have a field named 'type'
See original GitHub issueThe resolve_type
method on ObjectType
conflicts with actually resolving a field called type
. Given the importance of resolve
method names, I think great care should be taken to make sure graphene’s codebase does not use these method names unless necessary.
The below test fails with GraphQLError("'Location' object has no attribute 'T'",)
; renaming the resolve_type
method to _resolve_type
solves the problem.
import graphene
from graphql.core.type import GraphQLEnumValue
LOCATION_TYPES = {
'HQ': "Headquarters",
'BRANCH': "Branch Location",
}
LOCATIONS = {
'1': {
'type': 'HQ',
'address': '123 Main St',
'city': 'Metropolis',
},
'2': {
'type': 'BRANCH',
'address': '55 Side St',
'city': 'Smallville',
},
}
LocationType = graphene.Enum(
'LocationType',
{k: GraphQLEnumValue(value=k, description=v) for k, v in LOCATION_TYPES.items()}
)
class Location(graphene.ObjectType):
type = graphene.NonNull(LocationType)
address = graphene.NonNull(graphene.String())
city = graphene.NonNull(graphene.String())
class Query(graphene.ObjectType):
location = graphene.Field(Location, id=graphene.ID(description='location id'))
def resolve_location(self, args, info):
loc_id = args.get('id')
# error checking ommitted for brevity
return Location(**LOCATIONS[loc_id])
schema = graphene.Schema(name="Sample", query=Query)
EXPECTED_SCHEMA = """
type Location {
type: LocationType!
address: String!
city: String!
}
enum LocationType {
BRANCH
HQ
}
type Query {
location(id: ID): Location
}
""".lstrip()
QUERY = """
fragment locFields on Location {
type
address
city
}
query SomeQuery {
hq: location(id: 1) {
...locFields
}
branch: location(id: 2) {
...locFields
}
}
""".lstrip()
EXPECTED_RESPONSE = {
'hq': {
'type': 'HQ',
'address': '123 Main St',
'city': 'Metropolis'
},
'branch': {
'type': 'BRANCH',
'address': '55 Side St',
'city': 'Smallville'
},
}
def test_type():
assert str(schema) == EXPECTED_SCHEMA
result = schema.execute(QUERY)
assert not result.errors
assert result.data == EXPECTED_RESPONSE
Issue Analytics
- State:
- Created 8 years ago
- Reactions:2
- Comments:6 (4 by maintainers)
Top Results From Across the Web
Interface.resolve_type classmethod makes it impossible to ...
The resolve_type method on Interface conflicts with actually resolving a field called type. The below test fails with GraphQLError('Expected ...
Read more >Union type cannot resolve Object Type at Runtime
jkimbo answered the question here: class Character(Union): class Meta: types = (Human, Droid, Starship) @classmethod def resolve_type(cls, ...
Read more >ObjectType - Graphene-Python
Each ObjectType is a Python class that inherits from graphene.ObjectType . ... If we have a schema with Person type and one field...
Read more >Frequently Asked Questions - TypeGraphQL
Should I implement a field resolver as an object type getter, a method or a resolver class method? This depends on various factors:....
Read more >Resolvers - Apollo GraphQL Docs
This object is called the resolver map. The resolver map has top-level fields that correspond to your schema's types (such as Query above)....
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Using type as a variable in Python code and using type as a field in a schema to send data between several systems, many of which may not be written in Python, are two different scenarios.
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.