Skip to content

Commit b431bfe

Browse files
committed
Fixed django OneToOne inverse relationship conversion. Fix #170
1 parent 226f81b commit b431bfe

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

graphene/contrib/django/converter.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,15 @@ def convert_date_to_string(field):
8080
return DateTime(description=field.help_text)
8181

8282

83+
@convert_django_field.register(models.OneToOneRel)
84+
def convert_onetoone_field_to_djangomodel(field):
85+
from .fields import DjangoModelField
86+
return DjangoModelField(get_related_model(field))
87+
88+
8389
@convert_django_field.register(models.ManyToManyField)
84-
@convert_django_field.register(models.ManyToOneRel)
8590
@convert_django_field.register(models.ManyToManyRel)
91+
@convert_django_field.register(models.ManyToOneRel)
8692
def convert_field_to_list_or_connection(field):
8793
from .fields import DjangoModelField, ConnectionOrListField
8894
model_field = DjangoModelField(get_related_model(field))
@@ -94,6 +100,8 @@ def convert_field_to_list_or_connection(field):
94100
def convert_relatedfield_to_djangomodel(field):
95101
from .fields import DjangoModelField, ConnectionOrListField
96102
model_field = DjangoModelField(field.model)
103+
if isinstance(field.field, models.OneToOneField):
104+
return model_field
97105
return ConnectionOrListField(model_field)
98106

99107

graphene/contrib/django/tests/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ class Pet(models.Model):
77
name = models.CharField(max_length=30)
88

99

10+
class FilmDetails(models.Model):
11+
location = models.CharField(max_length=30)
12+
film = models.OneToOneField('Film', related_name='details')
13+
14+
1015
class Film(models.Model):
1116
reporters = models.ManyToManyField('Reporter',
1217
related_name='films')

graphene/contrib/django/tests/test_converter.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
RangeField)
1010
from ..converter import convert_django_field, convert_django_field_with_choices
1111
from ..fields import ConnectionOrListField, DjangoModelField
12-
from .models import Article, Reporter
12+
from .models import Article, Reporter, Film, FilmDetails
1313

1414

1515
def assert_conversion(django_field, graphene_field, *args, **kwargs):
@@ -138,6 +138,15 @@ def test_should_manytoone_convert_connectionorlist():
138138
assert graphene_type.type.model == Article
139139

140140

141+
def test_should_onetoone_reverse_convert_model():
142+
# Django 1.9 uses 'rel', <1.9 uses 'related
143+
related = getattr(Film.details, 'rel', None) or \
144+
getattr(Film.details, 'related')
145+
graphene_type = convert_django_field(related)
146+
assert isinstance(graphene_type, DjangoModelField)
147+
assert graphene_type.model == FilmDetails
148+
149+
141150
def test_should_onetoone_convert_model():
142151
field = assert_conversion(models.OneToOneField, DjangoModelField, Article)
143152
assert field.type.model == Article

0 commit comments

Comments
 (0)