From 7fbc3e69b10c862afe58f123b59cd2f62dddda01 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 21 Sep 2016 19:32:39 -0700 Subject: [PATCH] Improved Django List retreival and added extra tests. --- examples/starwars/data.py | 3 +++ examples/starwars/models.py | 1 + examples/starwars/tests/test_connections.py | 27 +++++++++++++++++++++ graphene_django/converter.py | 6 ++--- graphene_django/fields.py | 12 ++++++--- 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/examples/starwars/data.py b/examples/starwars/data.py index b464731..9b52006 100644 --- a/examples/starwars/data.py +++ b/examples/starwars/data.py @@ -33,6 +33,9 @@ def initialize(): ) xwing.save() + human.ship = xwing + human.save() + ywing = Ship( id='2', name='Y-Wing', diff --git a/examples/starwars/models.py b/examples/starwars/models.py index 31d06fe..2f80e27 100644 --- a/examples/starwars/models.py +++ b/examples/starwars/models.py @@ -5,6 +5,7 @@ from django.db import models class Character(models.Model): name = models.CharField(max_length=50) + ship = models.ForeignKey('Ship', blank=True, null=True, related_name='characters') def __str__(self): return self.name diff --git a/examples/starwars/tests/test_connections.py b/examples/starwars/tests/test_connections.py index fa760d4..d266df3 100644 --- a/examples/starwars/tests/test_connections.py +++ b/examples/starwars/tests/test_connections.py @@ -45,3 +45,30 @@ def test_correct_fetch_first_ship_rebels(): result = schema.execute(query) assert not result.errors assert result.data == expected + + +def test_correct_list_characters(): + initialize() + query = ''' + query RebelsShipsQuery { + node(id: "U2hpcDox") { + ... on Ship { + name + characters { + name + } + } + } + } + ''' + expected = { + 'node': { + 'name': 'X-Wing', + 'characters': [{ + 'name': 'Human' + }], + } + } + result = schema.execute(query) + assert not result.errors + assert result.data == expected diff --git a/graphene_django/converter.py b/graphene_django/converter.py index ba898f7..88c32af 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -10,7 +10,7 @@ from graphene.utils.str_converters import to_const from .compat import (ArrayField, HStoreField, JSONField, RangeField, RelatedObject, UUIDField) -from .fields import get_connection_field, DjangoToManyField +from .fields import get_connection_field, DjangoListField from .utils import get_related_model, import_single_dispatch singledispatch = import_single_dispatch() @@ -133,7 +133,7 @@ def convert_field_to_list_or_connection(field, registry=None): if is_node(_type): return get_connection_field(_type) - return DjangoToManyField(_type) + return DjangoListField(_type) return Dynamic(dynamic_type) @@ -153,7 +153,7 @@ def convert_relatedfield_to_djangomodel(field, registry=None): if is_node(_type): return get_connection_field(_type) - return DjangoToManyField(_type) + return DjangoListField(_type) return Dynamic(dynamic_type) diff --git a/graphene_django/fields.py b/graphene_django/fields.py index 4d87ae4..c44b56e 100644 --- a/graphene_django/fields.py +++ b/graphene_django/fields.py @@ -9,17 +9,21 @@ from graphql_relay.connection.arrayconnection import connection_from_list_slice from .utils import DJANGO_FILTER_INSTALLED, maybe_queryset -class DjangoToManyField(Field): +class DjangoListField(Field): def __init__(self, _type, *args, **kwargs): - return super(DjangoToManyField, self).__init__(List(_type), *args, **kwargs) + return super(DjangoListField, self).__init__(List(_type), *args, **kwargs) + + @property + def model(self): + return self.type.of_type._meta.node._meta.model @staticmethod - def rel_resolver(resolver, root, args, context, info): + def list_resolver(resolver, root, args, context, info): return maybe_queryset(resolver(root, args, context, info)) def get_resolver(self, parent_resolver): - return partial(self.rel_resolver, parent_resolver) + return partial(self.list_resolver, parent_resolver) class DjangoConnectionField(ConnectionField):