Skip to content

Commit 83bc32b

Browse files
authored
Adding support for disabling enum creation on SerializerMutation (#851)
1 parent 6b8c5bd commit 83bc32b

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

graphene_django/rest_framework/mutation.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ class SerializerMutationOptions(MutationOptions):
1919
serializer_class = None
2020

2121

22-
def fields_for_serializer(serializer, only_fields, exclude_fields, is_input=False):
22+
def fields_for_serializer(
23+
serializer,
24+
only_fields,
25+
exclude_fields,
26+
is_input=False,
27+
convert_choices_to_enum=True,
28+
):
2329
fields = OrderedDict()
2430
for name, field in serializer.fields.items():
2531
is_not_in_only = only_fields and name not in only_fields
@@ -34,7 +40,9 @@ def fields_for_serializer(serializer, only_fields, exclude_fields, is_input=Fals
3440
if is_not_in_only or is_excluded:
3541
continue
3642

37-
fields[name] = convert_serializer_field(field, is_input=is_input)
43+
fields[name] = convert_serializer_field(
44+
field, is_input=is_input, convert_choices_to_enum=convert_choices_to_enum
45+
)
3846
return fields
3947

4048

@@ -55,6 +63,7 @@ def __init_subclass_with_meta__(
5563
model_operations=("create", "update"),
5664
only_fields=(),
5765
exclude_fields=(),
66+
convert_choices_to_enum=True,
5867
**options
5968
):
6069

@@ -74,10 +83,18 @@ def __init_subclass_with_meta__(
7483
lookup_field = model_class._meta.pk.name
7584

7685
input_fields = fields_for_serializer(
77-
serializer, only_fields, exclude_fields, is_input=True
86+
serializer,
87+
only_fields,
88+
exclude_fields,
89+
is_input=True,
90+
convert_choices_to_enum=convert_choices_to_enum,
7891
)
7992
output_fields = fields_for_serializer(
80-
serializer, only_fields, exclude_fields, is_input=False
93+
serializer,
94+
only_fields,
95+
exclude_fields,
96+
is_input=False,
97+
convert_choices_to_enum=convert_choices_to_enum,
8198
)
8299

83100
_meta = SerializerMutationOptions(cls)

graphene_django/rest_framework/serializer_converter.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,17 @@ def get_graphene_type_from_serializer_field(field):
1919
)
2020

2121

22-
def convert_serializer_field(field, is_input=True):
22+
def convert_serializer_field(field, is_input=True, convert_choices_to_enum=True):
2323
"""
2424
Converts a django rest frameworks field to a graphql field
2525
and marks the field as required if we are creating an input type
2626
and the field itself is required
2727
"""
2828

29-
graphql_type = get_graphene_type_from_serializer_field(field)
29+
if isinstance(field, serializers.ChoiceField) and not convert_choices_to_enum:
30+
graphql_type = graphene.String
31+
else:
32+
graphql_type = get_graphene_type_from_serializer_field(field)
3033

3134
args = []
3235
kwargs = {"description": field.help_text, "required": is_input and field.required}

graphene_django/rest_framework/tests/test_field_converter.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
from ..types import DictType
1111

1212

13-
def _get_type(rest_framework_field, is_input=True, **kwargs):
13+
def _get_type(
14+
rest_framework_field, is_input=True, convert_choices_to_enum=True, **kwargs
15+
):
1416
# prevents the following error:
1517
# AssertionError: The `source` argument is not meaningful when applied to a `child=` field.
1618
# Remove `source=` from the field declaration.
@@ -21,7 +23,9 @@ def _get_type(rest_framework_field, is_input=True, **kwargs):
2123

2224
field = rest_framework_field(**kwargs)
2325

24-
return convert_serializer_field(field, is_input=is_input)
26+
return convert_serializer_field(
27+
field, is_input=is_input, convert_choices_to_enum=convert_choices_to_enum
28+
)
2529

2630

2731
def assert_conversion(rest_framework_field, graphene_field, **kwargs):
@@ -73,6 +77,16 @@ def test_should_choice_convert_enum():
7377
assert field._meta.enum.__members__["W"].description == "World"
7478

7579

80+
def test_should_choice_convert_string_if_enum_disabled():
81+
assert_conversion(
82+
serializers.ChoiceField,
83+
graphene.String,
84+
choices=[("h", "Hello"), ("w", "World")],
85+
source="word",
86+
convert_choices_to_enum=False,
87+
)
88+
89+
7690
def test_should_base_field_convert_string():
7791
assert_conversion(serializers.Field, graphene.String)
7892

0 commit comments

Comments
 (0)