Skip to content

Commit cf657b3

Browse files
committed
Improved django support
1 parent b0f2b4d commit cf657b3

File tree

4 files changed

+50
-56
lines changed

4 files changed

+50
-56
lines changed

graphene/contrib/django/converter.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
DjangoModelField)
66
from graphene.core.fields import (BooleanField, FloatField, IDField, IntField,
77
StringField)
8+
from graphene.core.types.scalars import Boolean, Float, ID, Int, String
89

910
try:
1011
UUIDField = models.UUIDField
@@ -28,12 +29,12 @@ def convert_django_field(field):
2829
@convert_django_field.register(models.URLField)
2930
@convert_django_field.register(UUIDField)
3031
def convert_field_to_string(field):
31-
return StringField(description=field.help_text)
32+
return String(description=field.help_text)
3233

3334

3435
@convert_django_field.register(models.AutoField)
3536
def convert_field_to_id(field):
36-
return IDField(description=field.help_text)
37+
return ID(description=field.help_text)
3738

3839

3940
@convert_django_field.register(models.PositiveIntegerField)
@@ -42,23 +43,23 @@ def convert_field_to_id(field):
4243
@convert_django_field.register(models.BigIntegerField)
4344
@convert_django_field.register(models.IntegerField)
4445
def convert_field_to_int(field):
45-
return IntField(description=field.help_text)
46+
return Int(description=field.help_text)
4647

4748

4849
@convert_django_field.register(models.BooleanField)
4950
def convert_field_to_boolean(field):
50-
return BooleanField(description=field.help_text, required=True)
51+
return Boolean(description=field.help_text, required=True)
5152

5253

5354
@convert_django_field.register(models.NullBooleanField)
5455
def convert_field_to_nullboolean(field):
55-
return BooleanField(description=field.help_text)
56+
return Boolean(description=field.help_text)
5657

5758

5859
@convert_django_field.register(models.DecimalField)
5960
@convert_django_field.register(models.FloatField)
6061
def convert_field_to_float(field):
61-
return FloatField(description=field.help_text)
62+
return Float(description=field.help_text)
6263

6364

6465
@convert_django_field.register(models.ManyToManyField)

graphene/contrib/django/fields.py

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,57 @@
11
from graphene import relay
22
from graphene.contrib.django.utils import get_type_for_model, lazy_map
3-
from graphene.core.fields import Field, LazyField, ListField
3+
from graphene.core.fields import Field, ListField
4+
from graphene.core.types.base import FieldType
45
from graphene.relay.utils import is_node
56

67

78
class DjangoConnectionField(relay.ConnectionField):
89

910
def wrap_resolved(self, value, instance, args, info):
1011
schema = info.schema.graphene_schema
11-
return lazy_map(value, self.get_object_type(schema))
12+
return lazy_map(value, self.type.get_object_type(schema))
1213

1314

1415
class LazyListField(ListField):
1516

16-
def resolve(self, instance, args, info):
17+
def resolver(self, instance, args, info):
1718
schema = info.schema.graphene_schema
18-
resolved = super(LazyListField, self).resolve(instance, args, info)
19+
resolved = super(LazyListField, self).resolver(instance, args, info)
1920
return lazy_map(resolved, self.get_object_type(schema))
2021

2122

22-
class ConnectionOrListField(LazyField):
23+
class ConnectionOrListField(Field):
2324

24-
def get_field(self, schema):
25-
model_field = self.field_type
25+
def internal_type(self, schema):
26+
model_field = self.type
2627
field_object_type = model_field.get_object_type(schema)
2728
if is_node(field_object_type):
2829
field = DjangoConnectionField(model_field)
2930
else:
3031
field = LazyListField(model_field)
3132
field.contribute_to_class(self.object_type, self.name)
32-
return field
33+
return field.internal_type(schema)
3334

3435

35-
class DjangoModelField(Field):
36+
class DjangoModelField(FieldType):
3637

3738
def __init__(self, model, *args, **kwargs):
38-
super(DjangoModelField, self).__init__(None, *args, **kwargs)
3939
self.model = model
40-
41-
def resolve(self, instance, args, info):
42-
resolved = super(DjangoModelField, self).resolve(instance, args, info)
43-
schema = info.schema.graphene_schema
44-
_type = self.get_object_type(schema)
45-
assert _type, ("Field %s cannot be retrieved as the "
46-
"ObjectType is not registered by the schema" % (
47-
self.attname
48-
))
49-
return _type(resolved)
40+
super(DjangoModelField, self).__init__(*args, **kwargs)
5041

5142
def internal_type(self, schema):
5243
_type = self.get_object_type(schema)
53-
if not _type and self.object_type._meta.only_fields:
44+
if not _type and self.parent._meta.only_fields:
5445
raise Exception(
5546
"Model %r is not accessible by the schema. "
5647
"You can either register the type manually "
5748
"using @schema.register. "
58-
"Or disable the field %s in %s" % (
49+
"Or disable the field in %s" % (
5950
self.model,
60-
self.attname,
61-
self.object_type
51+
self.parent,
6252
)
6353
)
64-
return schema.T(_type) or Field.SKIP
54+
return schema.T(_type)
6555

6656
def get_object_type(self, schema):
6757
return get_type_for_model(schema, self.model)

tests/contrib_django/test_converter.py

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ def assert_conversion(django_field, graphene_field, *args):
1515
field = django_field(*args, help_text='Custom Help Text')
1616
graphene_type = convert_django_field(field)
1717
assert isinstance(graphene_type, graphene_field)
18-
assert graphene_type.description == 'Custom Help Text'
19-
return graphene_type
18+
field = graphene_type.as_field()
19+
assert field.description == 'Custom Help Text'
20+
return field
2021

2122

2223
def test_should_unknown_django_field_raise_exception():
@@ -26,86 +27,86 @@ def test_should_unknown_django_field_raise_exception():
2627

2728

2829
def test_should_date_convert_string():
29-
assert_conversion(models.DateField, graphene.StringField)
30+
assert_conversion(models.DateField, graphene.String)
3031

3132

3233
def test_should_char_convert_string():
33-
assert_conversion(models.CharField, graphene.StringField)
34+
assert_conversion(models.CharField, graphene.String)
3435

3536

3637
def test_should_text_convert_string():
37-
assert_conversion(models.TextField, graphene.StringField)
38+
assert_conversion(models.TextField, graphene.String)
3839

3940

4041
def test_should_email_convert_string():
41-
assert_conversion(models.EmailField, graphene.StringField)
42+
assert_conversion(models.EmailField, graphene.String)
4243

4344

4445
def test_should_slug_convert_string():
45-
assert_conversion(models.SlugField, graphene.StringField)
46+
assert_conversion(models.SlugField, graphene.String)
4647

4748

4849
def test_should_url_convert_string():
49-
assert_conversion(models.URLField, graphene.StringField)
50+
assert_conversion(models.URLField, graphene.String)
5051

5152

5253
def test_should_auto_convert_id():
53-
assert_conversion(models.AutoField, graphene.IDField)
54+
assert_conversion(models.AutoField, graphene.ID)
5455

5556

5657
def test_should_positive_integer_convert_int():
57-
assert_conversion(models.PositiveIntegerField, graphene.IntField)
58+
assert_conversion(models.PositiveIntegerField, graphene.Int)
5859

5960

6061
def test_should_positive_small_convert_int():
61-
assert_conversion(models.PositiveSmallIntegerField, graphene.IntField)
62+
assert_conversion(models.PositiveSmallIntegerField, graphene.Int)
6263

6364

6465
def test_should_small_integer_convert_int():
65-
assert_conversion(models.SmallIntegerField, graphene.IntField)
66+
assert_conversion(models.SmallIntegerField, graphene.Int)
6667

6768

6869
def test_should_big_integer_convert_int():
69-
assert_conversion(models.BigIntegerField, graphene.IntField)
70+
assert_conversion(models.BigIntegerField, graphene.Int)
7071

7172

7273
def test_should_integer_convert_int():
73-
assert_conversion(models.IntegerField, graphene.IntField)
74+
assert_conversion(models.IntegerField, graphene.Int)
7475

7576

7677
def test_should_boolean_convert_boolean():
77-
field = assert_conversion(models.BooleanField, graphene.BooleanField)
78+
field = assert_conversion(models.BooleanField, graphene.Boolean)
7879
assert field.required is True
7980

8081

8182
def test_should_nullboolean_convert_boolean():
82-
field = assert_conversion(models.NullBooleanField, graphene.BooleanField)
83+
field = assert_conversion(models.NullBooleanField, graphene.Boolean)
8384
assert field.required is False
8485

8586

8687
def test_should_float_convert_float():
87-
assert_conversion(models.FloatField, graphene.FloatField)
88+
assert_conversion(models.FloatField, graphene.Float)
8889

8990

9091
def test_should_manytomany_convert_connectionorlist():
9192
graphene_type = convert_django_field(Reporter._meta.local_many_to_many[0])
9293
assert isinstance(graphene_type, ConnectionOrListField)
93-
assert isinstance(graphene_type.field_type, DjangoModelField)
94-
assert graphene_type.field_type.model == Reporter
94+
assert isinstance(graphene_type.type, DjangoModelField)
95+
assert graphene_type.type.model == Reporter
9596

9697

9798
def test_should_manytoone_convert_connectionorlist():
9899
graphene_type = convert_django_field(Reporter.articles.related)
99100
assert isinstance(graphene_type, ConnectionOrListField)
100-
assert isinstance(graphene_type.field_type, DjangoModelField)
101-
assert graphene_type.field_type.model == Article
101+
assert isinstance(graphene_type.type, DjangoModelField)
102+
assert graphene_type.type.model == Article
102103

103104

104105
def test_should_onetoone_convert_model():
105106
field = assert_conversion(models.OneToOneField, DjangoModelField, Article)
106-
assert field.model == Article
107+
assert field.type.model == Article
107108

108109

109110
def test_should_foreignkey_convert_model():
110111
field = assert_conversion(models.ForeignKey, DjangoModelField, Article)
111-
assert field.model == Article
112+
assert field.type.model == Article

tests/contrib_django/test_types.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from graphene import Schema
44
from graphene.contrib.django.types import DjangoInterface, DjangoNode
5-
from graphene.core.fields import IntField
5+
from graphene.core.fields import IntField, Field
6+
from graphene.core.types.scalars import String, Int
67
from graphene.relay.fields import GlobalIDField
78
from graphql.core.type import GraphQLInterfaceType, GraphQLObjectType
89
from tests.utils import assert_equal_lists
@@ -57,7 +58,8 @@ def test_node_idfield():
5758

5859
def test_node_replacedfield():
5960
idfield = Human._meta.fields_map['pub_date']
60-
assert isinstance(idfield, IntField)
61+
assert isinstance(idfield, Field)
62+
assert schema.T(idfield).type == schema.T(Int())
6163

6264

6365
def test_interface_resolve_type():

0 commit comments

Comments
 (0)