Added support for SimpleLazyObject. Fixed #22

This commit is contained in:
Syrus Akbary 2016-10-15 17:40:12 -07:00
parent 8136223bb1
commit d73f4aa235
2 changed files with 36 additions and 0 deletions

View File

@ -2,6 +2,7 @@ import datetime
import pytest import pytest
from django.db import models from django.db import models
from django.utils.functional import SimpleLazyObject
from py.test import raises from py.test import raises
import graphene import graphene
@ -33,6 +34,37 @@ def test_should_query_only_fields():
assert not result.errors assert not result.errors
def test_should_query_simplelazy_objects():
class ReporterType(DjangoObjectType):
class Meta:
model = Reporter
only_fields = ('id', )
class Query(graphene.ObjectType):
reporter = graphene.Field(ReporterType)
def resolve_reporter(self, args, context, info):
return SimpleLazyObject(lambda: Reporter(id=1))
schema = graphene.Schema(query=Query)
query = '''
query {
reporter {
id
}
}
'''
result = schema.execute(query)
assert not result.errors
assert result.data == {
'reporter': {
'id': '1'
}
}
def test_should_query_well(): def test_should_query_well():
class ReporterType(DjangoObjectType): class ReporterType(DjangoObjectType):

View File

@ -2,6 +2,7 @@ from collections import OrderedDict
import six import six
from django.utils.functional import SimpleLazyObject
from graphene import Field, ObjectType from graphene import Field, ObjectType
from graphene.types.objecttype import ObjectTypeMeta from graphene.types.objecttype import ObjectTypeMeta
from graphene.types.options import Options from graphene.types.options import Options
@ -103,6 +104,9 @@ class DjangoObjectType(six.with_metaclass(DjangoObjectTypeMeta, ObjectType)):
@classmethod @classmethod
def is_type_of(cls, root, context, info): def is_type_of(cls, root, context, info):
if isinstance(root, SimpleLazyObject):
root._setup()
root = root._wrapped
if isinstance(root, cls): if isinstance(root, cls):
return True return True
if not is_valid_django_model(type(root)): if not is_valid_django_model(type(root)):