Skip to content

Commit 5c367ae

Browse files
committed
Use singledispatch to convert Django field to GraphQL field
1 parent 6eca588 commit 5c367ae

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

graphql/contrib/django/__init__.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,43 @@
11
from graphql.api import Schema
2+
from singledispatch import singledispatch
23
from django.db import models
34

45

6+
@singledispatch
7+
def convert_django_field(field, schema):
8+
raise NotImplemented
9+
10+
11+
@convert_django_field.register(models.CharField)
12+
def _(field, schema):
13+
return schema.Field(schema.String)
14+
15+
16+
@convert_django_field.register(models.AutoField)
17+
def _(field, schema):
18+
return schema.Field(schema.ID)
19+
20+
21+
@convert_django_field.register(models.IntegerField)
22+
def _(field, schema):
23+
return schema.Field(schema.Int)
24+
25+
26+
@convert_django_field.register(models.BigIntegerField)
27+
def _(field, schema):
28+
raise NotImplemented
29+
30+
31+
@convert_django_field.register(models.BooleanField)
32+
def _(field, schema):
33+
return schema.Field(schema.Boolean)
34+
35+
36+
@convert_django_field.register(models.FloatField)
37+
def _(field, schema):
38+
return schema.Field(schema.Float)
39+
40+
541
class DjangoSchema(Schema):
642
def __init__(self):
743
super(DjangoSchema, self).__init__()
@@ -14,7 +50,6 @@ def _define_object(self, dct):
1450
if field.is_relation:
1551
pass # TODO
1652
else:
17-
if isinstance(field, models.CharField):
18-
dct[field.name] = self.Field(self.String)
53+
dct[field.name] = convert_django_field(field, self)
1954
# ... TODO
2055
return super(DjangoSchema, self)._define_object(dct)

setup.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ def run_tests(self):
4949
install_requires=[],
5050
tests_require=['pytest>=2.7.2'],
5151
extras_require={
52-
'django': ['Django>=1.8.0,<1.9'],
52+
'django': [
53+
'Django>=1.8.0,<1.9',
54+
'singledispatch>=3.4.0.3',
55+
],
5356
},
5457

5558
cmdclass={'test': PyTest},

tests/contrib_django/test_django.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717

1818
class Human(models.Model):
1919
name = models.CharField()
20+
i = models.IntegerField()
21+
si = models.SmallIntegerField()
22+
b = models.BooleanField()
2023

2124
class Meta:
2225
app_label = 'graphql'
@@ -34,14 +37,14 @@ class HumanType(gql.ObjectType):
3437
class QueryRoot(gql.QueryRoot):
3538
@gql.Field(gql.List(gql.NonNull(HumanType)))
3639
def humans(self, *args, **kwargs):
37-
return [Human(name='hi')]
40+
return [Human(id=1, name='hi', i=123, si=1, b=True)]
3841

3942
result = gql.execute('''{
40-
humans { name }
43+
humans { id, name, i, si, b }
4144
}''')
4245
assert not result.errors
4346
assert result.data == {
4447
'humans': [
45-
{'name': 'hi'}
48+
{'id': '1', 'name': 'hi', 'i': 123, 'si': 1, 'b': True}
4649
]
4750
}

0 commit comments

Comments
 (0)