Skip to content

Commit 21bad61

Browse files
authored
Merge pull request #472 from wsantos/master
Exclude id from mutation for create operations
2 parents a59f41b + 9cf52ca commit 21bad61

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

graphene_django/forms/mutation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ def __init_subclass_with_meta__(
161161

162162
form = form_class()
163163
input_fields = fields_for_form(form, only_fields, exclude_fields)
164-
input_fields["id"] = graphene.ID()
164+
if "id" not in exclude_fields:
165+
input_fields["id"] = graphene.ID()
165166

166167
registry = get_global_registry()
167168
model_type = registry.get_type_for_model(model)

graphene_django/forms/tests/test_mutation.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class MyForm(forms.Form):
1313
class PetForm(forms.ModelForm):
1414
class Meta:
1515
model = Pet
16-
fields = ("name",)
16+
fields = '__all__'
1717

1818

1919
def test_needs_form_class():
@@ -51,6 +51,30 @@ class Meta:
5151
self.assertEqual(PetMutation._meta.return_field_name, "pet")
5252
self.assertIn("pet", PetMutation._meta.fields)
5353

54+
def test_default_input_meta_fields(self):
55+
class PetMutation(DjangoModelFormMutation):
56+
class Meta:
57+
form_class = PetForm
58+
59+
self.assertEqual(PetMutation._meta.model, Pet)
60+
self.assertEqual(PetMutation._meta.return_field_name, "pet")
61+
self.assertIn("name", PetMutation.Input._meta.fields)
62+
self.assertIn("client_mutation_id", PetMutation.Input._meta.fields)
63+
self.assertIn("id", PetMutation.Input._meta.fields)
64+
65+
def test_exclude_fields_input_meta_fields(self):
66+
class PetMutation(DjangoModelFormMutation):
67+
class Meta:
68+
form_class = PetForm
69+
exclude_fields = ['id']
70+
71+
self.assertEqual(PetMutation._meta.model, Pet)
72+
self.assertEqual(PetMutation._meta.return_field_name, "pet")
73+
self.assertIn("name", PetMutation.Input._meta.fields)
74+
self.assertIn("age", PetMutation.Input._meta.fields)
75+
self.assertIn("client_mutation_id", PetMutation.Input._meta.fields)
76+
self.assertNotIn("id", PetMutation.Input._meta.fields)
77+
5478
def test_return_field_name_is_camelcased(self):
5579
class PetMutation(DjangoModelFormMutation):
5680
class Meta:
@@ -76,9 +100,9 @@ class PetMutation(DjangoModelFormMutation):
76100
class Meta:
77101
form_class = PetForm
78102

79-
pet = Pet.objects.create(name="Axel")
103+
pet = Pet.objects.create(name="Axel", age=10)
80104

81-
result = PetMutation.mutate_and_get_payload(None, None, id=pet.pk, name="Mia")
105+
result = PetMutation.mutate_and_get_payload(None, None, id=pet.pk, name="Mia", age=10)
82106

83107
self.assertEqual(Pet.objects.count(), 1)
84108
pet.refresh_from_db()
@@ -90,11 +114,12 @@ class PetMutation(DjangoModelFormMutation):
90114
class Meta:
91115
form_class = PetForm
92116

93-
result = PetMutation.mutate_and_get_payload(None, None, name="Mia")
117+
result = PetMutation.mutate_and_get_payload(None, None, name="Mia", age=10)
94118

95119
self.assertEqual(Pet.objects.count(), 1)
96120
pet = Pet.objects.get()
97121
self.assertEqual(pet.name, "Mia")
122+
self.assertEqual(pet.age, 10)
98123
self.assertEqual(result.errors, [])
99124

100125
def test_model_form_mutation_mutate_invalid_form(self):
@@ -107,6 +132,10 @@ class Meta:
107132
# A pet was not created
108133
self.assertEqual(Pet.objects.count(), 0)
109134

110-
self.assertEqual(len(result.errors), 1)
111-
self.assertEqual(result.errors[0].field, "name")
135+
136+
fields_w_error = [e.field for e in result.errors]
137+
self.assertEqual(len(result.errors), 2)
138+
self.assertIn("name", fields_w_error)
112139
self.assertEqual(result.errors[0].messages, ["This field is required."])
140+
self.assertIn("age", fields_w_error)
141+
self.assertEqual(result.errors[1].messages, ["This field is required."])

graphene_django/tests/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
class Pet(models.Model):
1010
name = models.CharField(max_length=30)
11+
age = models.PositiveIntegerField()
1112

1213

1314
class FilmDetails(models.Model):

0 commit comments

Comments
 (0)