Skip to content

Commit fdb7d5a

Browse files
authored
Merge pull request #395 from mbarrientos/drf-list-serializers
Fixes #371 - Support ListSerializer fields in SerializerMutation
2 parents 8151fe7 + 3793ce1 commit fdb7d5a

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

graphene_django/rest_framework/serializer_converter.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ def convert_serializer_field(field, is_input=True):
4646
global_registry = get_global_registry()
4747
field_model = field.Meta.model
4848
args = [global_registry.get_type_for_model(field_model)]
49+
elif isinstance(field, serializers.ListSerializer):
50+
field = field.child
51+
if is_input:
52+
kwargs['of_type'] = convert_serializer_to_input_type(field.__class__)
53+
else:
54+
del kwargs['of_type']
55+
global_registry = get_global_registry()
56+
field_model = field.Meta.model
57+
args = [global_registry.get_type_for_model(field_model)]
4958

5059
return graphql_type(*args, **kwargs)
5160

@@ -75,6 +84,12 @@ def convert_serializer_to_field(field):
7584
return graphene.Field
7685

7786

87+
@get_graphene_type_from_serializer_field.register(serializers.ListSerializer)
88+
def convert_list_serializer_to_field(field):
89+
child_type = get_graphene_type_from_serializer_field(field.child)
90+
return (graphene.List, child_type)
91+
92+
7893
@get_graphene_type_from_serializer_field.register(serializers.IntegerField)
7994
def convert_serializer_field_to_int(field):
8095
return graphene.Int

graphene_django/rest_framework/tests/test_field_converter.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import copy
2-
from rest_framework import serializers
3-
from py.test import raises
42

53
import graphene
4+
from django.db import models
5+
from graphene import InputObjectType
6+
from py.test import raises
7+
from rest_framework import serializers
68

79
from ..serializer_converter import convert_serializer_field
810
from ..types import DictType
@@ -74,7 +76,6 @@ def test_should_uuid_convert_string():
7476

7577

7678
def test_should_model_convert_field():
77-
7879
class MyModelSerializer(serializers.ModelSerializer):
7980
class Meta:
8081
model = None
@@ -128,6 +129,30 @@ class StringListField(serializers.ListField):
128129
assert field_b.of_type == graphene.String
129130

130131

132+
def test_should_list_serializer_convert_to_list():
133+
class FooModel(models.Model):
134+
pass
135+
136+
class ChildSerializer(serializers.ModelSerializer):
137+
class Meta:
138+
model = FooModel
139+
fields = '__all__'
140+
141+
class ParentSerializer(serializers.ModelSerializer):
142+
child = ChildSerializer(many=True)
143+
144+
class Meta:
145+
model = FooModel
146+
fields = '__all__'
147+
148+
converted_type = convert_serializer_field(ParentSerializer().get_fields()['child'], is_input=True)
149+
assert isinstance(converted_type, graphene.List)
150+
151+
converted_type = convert_serializer_field(ParentSerializer().get_fields()['child'], is_input=False)
152+
assert isinstance(converted_type, graphene.List)
153+
assert converted_type.of_type is None
154+
155+
131156
def test_should_dict_convert_dict():
132157
assert_conversion(serializers.DictField, DictType)
133158

@@ -157,6 +182,6 @@ def test_should_json_convert_jsonstring():
157182

158183

159184
def test_should_multiplechoicefield_convert_to_list_of_string():
160-
field = assert_conversion(serializers.MultipleChoiceField, graphene.List, choices=[1,2,3])
185+
field = assert_conversion(serializers.MultipleChoiceField, graphene.List, choices=[1, 2, 3])
161186

162187
assert field.of_type == graphene.String

0 commit comments

Comments
 (0)