From 3793ce17c0274dd432f77675877623ecdd92b5df Mon Sep 17 00:00:00 2001 From: mbarrientos Date: Tue, 13 Feb 2018 11:48:43 +0100 Subject: [PATCH] Add support for ListSerializer fields in SerializerMutation --- .../rest_framework/serializer_converter.py | 15 +++++++++ .../tests/test_field_converter.py | 33 ++++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/graphene_django/rest_framework/serializer_converter.py b/graphene_django/rest_framework/serializer_converter.py index 44cb01d..014d42a 100644 --- a/graphene_django/rest_framework/serializer_converter.py +++ b/graphene_django/rest_framework/serializer_converter.py @@ -46,6 +46,15 @@ def convert_serializer_field(field, is_input=True): global_registry = get_global_registry() field_model = field.Meta.model args = [global_registry.get_type_for_model(field_model)] + elif isinstance(field, serializers.ListSerializer): + field = field.child + if is_input: + kwargs['of_type'] = convert_serializer_to_input_type(field.__class__) + else: + del kwargs['of_type'] + global_registry = get_global_registry() + field_model = field.Meta.model + args = [global_registry.get_type_for_model(field_model)] return graphql_type(*args, **kwargs) @@ -75,6 +84,12 @@ def convert_serializer_to_field(field): return graphene.Field +@get_graphene_type_from_serializer_field.register(serializers.ListSerializer) +def convert_list_serializer_to_field(field): + child_type = get_graphene_type_from_serializer_field(field.child) + return (graphene.List, child_type) + + @get_graphene_type_from_serializer_field.register(serializers.IntegerField) def convert_serializer_field_to_int(field): return graphene.Int diff --git a/graphene_django/rest_framework/tests/test_field_converter.py b/graphene_django/rest_framework/tests/test_field_converter.py index ec851c2..22a0ba9 100644 --- a/graphene_django/rest_framework/tests/test_field_converter.py +++ b/graphene_django/rest_framework/tests/test_field_converter.py @@ -1,8 +1,10 @@ import copy -from rest_framework import serializers -from py.test import raises import graphene +from django.db import models +from graphene import InputObjectType +from py.test import raises +from rest_framework import serializers from ..serializer_converter import convert_serializer_field from ..types import DictType @@ -74,7 +76,6 @@ def test_should_uuid_convert_string(): def test_should_model_convert_field(): - class MyModelSerializer(serializers.ModelSerializer): class Meta: model = None @@ -128,6 +129,30 @@ def test_should_list_convert_to_list(): assert field_b.of_type == graphene.String +def test_should_list_serializer_convert_to_list(): + class FooModel(models.Model): + pass + + class ChildSerializer(serializers.ModelSerializer): + class Meta: + model = FooModel + fields = '__all__' + + class ParentSerializer(serializers.ModelSerializer): + child = ChildSerializer(many=True) + + class Meta: + model = FooModel + fields = '__all__' + + converted_type = convert_serializer_field(ParentSerializer().get_fields()['child'], is_input=True) + assert isinstance(converted_type, graphene.List) + + converted_type = convert_serializer_field(ParentSerializer().get_fields()['child'], is_input=False) + assert isinstance(converted_type, graphene.List) + assert converted_type.of_type is None + + def test_should_dict_convert_dict(): assert_conversion(serializers.DictField, DictType) @@ -157,6 +182,6 @@ def test_should_json_convert_jsonstring(): def test_should_multiplechoicefield_convert_to_list_of_string(): - field = assert_conversion(serializers.MultipleChoiceField, graphene.List, choices=[1,2,3]) + field = assert_conversion(serializers.MultipleChoiceField, graphene.List, choices=[1, 2, 3]) assert field.of_type == graphene.String