Skip to content

Commit 5d7a04f

Browse files
Update mutation.py to serialize Enum objects into input values (#1431)
* Fix for issue #1385: Update mutation.py to serialize Enum objects into input values for ChoiceFields * Update graphene_django/rest_framework/mutation.py Co-authored-by: Steven DeMartini <[email protected]> --------- Co-authored-by: Steven DeMartini <[email protected]>
1 parent 3172710 commit 5d7a04f

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

Diff for: graphene_django/rest_framework/models.py

+11
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,14 @@ class MyFakeModelWithPassword(models.Model):
1414
class MyFakeModelWithDate(models.Model):
1515
cool_name = models.CharField(max_length=50)
1616
last_edited = models.DateField()
17+
18+
19+
class MyFakeModelWithChoiceField(models.Model):
20+
class ChoiceType(models.Choices):
21+
ASDF = "asdf"
22+
HI = "hi"
23+
24+
choice_type = models.CharField(
25+
max_length=4,
26+
default=ChoiceType.HI.name,
27+
)

Diff for: graphene_django/rest_framework/mutation.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from enum import Enum
2+
13
from collections import OrderedDict
24

35
from django.shortcuts import get_object_or_404
@@ -124,8 +126,10 @@ def __init_subclass_with_meta__(
124126
def get_serializer_kwargs(cls, root, info, **input):
125127
lookup_field = cls._meta.lookup_field
126128
model_class = cls._meta.model_class
127-
128129
if model_class:
130+
for input_dict_key, maybe_enum in input.items():
131+
if isinstance(maybe_enum, Enum):
132+
input[input_dict_key] = maybe_enum.value
129133
if "update" in cls._meta.model_operations and lookup_field in input:
130134
instance = get_object_or_404(
131135
model_class, **{lookup_field: input[lookup_field]}

Diff for: graphene_django/rest_framework/tests/test_mutation.py

+39-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
from graphene.types.inputobjecttype import InputObjectType
88

99
from ...types import DjangoObjectType
10-
from ..models import MyFakeModel, MyFakeModelWithDate, MyFakeModelWithPassword
10+
from ..models import (
11+
MyFakeModel,
12+
MyFakeModelWithDate,
13+
MyFakeModelWithPassword,
14+
MyFakeModelWithChoiceField,
15+
)
1116
from ..mutation import SerializerMutation
1217

1318

@@ -268,6 +273,39 @@ class Meta:
268273
assert result.days_since_last_edit == 4
269274

270275

276+
def test_perform_mutate_success_with_enum_choice_field():
277+
class ListViewChoiceFieldSerializer(serializers.ModelSerializer):
278+
choice_type = serializers.ChoiceField(
279+
choices=[(x.name, x.value) for x in MyFakeModelWithChoiceField.ChoiceType],
280+
required=False,
281+
)
282+
283+
class Meta:
284+
model = MyFakeModelWithChoiceField
285+
fields = "__all__"
286+
287+
class SomeCreateSerializerMutation(SerializerMutation):
288+
class Meta:
289+
serializer_class = ListViewChoiceFieldSerializer
290+
291+
choice_type = {
292+
"choice_type": SomeCreateSerializerMutation.Input.choice_type.type.get("ASDF")
293+
}
294+
name = MyFakeModelWithChoiceField.ChoiceType.ASDF.name
295+
result = SomeCreateSerializerMutation.mutate_and_get_payload(
296+
None, mock_info(), **choice_type
297+
)
298+
assert result.errors is None
299+
assert result.choice_type == name
300+
kwargs = SomeCreateSerializerMutation.get_serializer_kwargs(
301+
None, mock_info(), **choice_type
302+
)
303+
assert kwargs["data"]["choice_type"] == name
304+
assert 1 == MyFakeModelWithChoiceField.objects.count()
305+
item = MyFakeModelWithChoiceField.objects.first()
306+
assert item.choice_type == name
307+
308+
271309
def test_mutate_and_get_payload_error():
272310
class MyMutation(SerializerMutation):
273311
class Meta:

0 commit comments

Comments
 (0)