Skip to content

Commit a2103c1

Browse files
Hisparphalt
authored andcommitted
Fix error of multiple inputs with the same type. When using same serializer. (#530)
1 parent 0988e07 commit a2103c1

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

graphene_django/rest_framework/serializer_converter.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,25 @@ def convert_serializer_field(field, is_input=True):
5757

5858

5959
def convert_serializer_to_input_type(serializer_class):
60+
cached_type = convert_serializer_to_input_type.cache.get(serializer_class.__name__, None)
61+
if cached_type:
62+
return cached_type
6063
serializer = serializer_class()
6164

6265
items = {
6366
name: convert_serializer_field(field)
6467
for name, field in serializer.fields.items()
6568
}
66-
67-
return type(
69+
ret_type = type(
6870
"{}Input".format(serializer.__class__.__name__),
6971
(graphene.InputObjectType,),
7072
items,
7173
)
74+
convert_serializer_to_input_type.cache[serializer_class.__name__] = ret_type
75+
return ret_type
76+
77+
78+
convert_serializer_to_input_type.cache = {}
7279

7380

7481
@get_graphene_type_from_serializer_field.register(serializers.Field)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import graphene
2+
import pytest
3+
from django.db import models
4+
from graphene import Schema
5+
from rest_framework import serializers
6+
7+
from graphene_django import DjangoObjectType
8+
from graphene_django.rest_framework.mutation import SerializerMutation
9+
10+
pytestmark = pytest.mark.django_db
11+
12+
13+
class MyFakeChildModel(models.Model):
14+
name = models.CharField(max_length=50)
15+
created = models.DateTimeField(auto_now_add=True)
16+
17+
18+
class MyFakeParentModel(models.Model):
19+
name = models.CharField(max_length=50)
20+
created = models.DateTimeField(auto_now_add=True)
21+
child1 = models.OneToOneField(MyFakeChildModel, related_name='parent1', on_delete=models.CASCADE)
22+
child2 = models.OneToOneField(MyFakeChildModel, related_name='parent2', on_delete=models.CASCADE)
23+
24+
25+
class ParentType(DjangoObjectType):
26+
class Meta:
27+
model = MyFakeParentModel
28+
interfaces = (graphene.relay.Node,)
29+
30+
31+
class ChildType(DjangoObjectType):
32+
class Meta:
33+
model = MyFakeChildModel
34+
interfaces = (graphene.relay.Node,)
35+
36+
37+
class MyModelChildSerializer(serializers.ModelSerializer):
38+
class Meta:
39+
model = MyFakeChildModel
40+
fields = "__all__"
41+
42+
43+
class MyModelParentSerializer(serializers.ModelSerializer):
44+
child1 = MyModelChildSerializer()
45+
child2 = MyModelChildSerializer()
46+
47+
class Meta:
48+
model = MyFakeParentModel
49+
fields = "__all__"
50+
51+
52+
class MyParentModelMutation(SerializerMutation):
53+
class Meta:
54+
serializer_class = MyModelParentSerializer
55+
56+
57+
class Mutation(graphene.ObjectType):
58+
createParentWithChild = MyParentModelMutation.Field()
59+
60+
61+
def test_create_schema():
62+
schema = Schema(mutation=Mutation, types=[ParentType, ChildType])
63+
assert schema

0 commit comments

Comments
 (0)