Skip to content

Commit d72b279

Browse files
committed
Add support for write_only fields in SerializerMutation
1 parent f76f38e commit d72b279

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

graphene_django/rest_framework/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,8 @@
44
class MyFakeModel(models.Model):
55
cool_name = models.CharField(max_length=50)
66
created = models.DateTimeField(auto_now_add=True)
7+
8+
9+
class MyFakeModelWithPassword(models.Model):
10+
cool_name = models.CharField(max_length=50)
11+
password = models.CharField(max_length=50)

graphene_django/rest_framework/mutation.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ def fields_for_serializer(serializer, only_fields, exclude_fields, is_input=Fals
2727
name
2828
in exclude_fields # or
2929
# name in already_created_fields
30+
) or (
31+
field.write_only and not is_input # don't show write_only fields in Query
3032
)
3133

3234
if is_not_in_only or is_excluded:
@@ -138,6 +140,7 @@ def perform_mutate(cls, serializer, info):
138140

139141
kwargs = {}
140142
for f, field in serializer.fields.items():
141-
kwargs[f] = field.get_attribute(obj)
143+
if not field.write_only:
144+
kwargs[f] = field.get_attribute(obj)
142145

143146
return cls(errors=None, **kwargs)

graphene_django/rest_framework/tests/test_mutation.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from rest_framework import serializers
88

99
from ...types import DjangoObjectType
10-
from ..models import MyFakeModel
10+
from ..models import MyFakeModel, MyFakeModelWithPassword
1111
from ..mutation import SerializerMutation
1212

1313

@@ -86,6 +86,47 @@ class Meta:
8686
assert "created" not in MyMutation.Input._meta.fields
8787

8888

89+
@mark.django_db
90+
def test_write_only_field():
91+
class WriteOnlyFieldModelSerializer(serializers.ModelSerializer):
92+
password = serializers.CharField(write_only=True)
93+
94+
class Meta:
95+
model = MyFakeModelWithPassword
96+
fields = ["cool_name", "password"]
97+
98+
class MyMutation(SerializerMutation):
99+
class Meta:
100+
serializer_class = WriteOnlyFieldModelSerializer
101+
102+
result = MyMutation.mutate_and_get_payload(
103+
None, mock_info(), **{"cool_name": "New Narf", "password": "admin"}
104+
)
105+
106+
assert hasattr(result, "cool_name")
107+
assert not hasattr(result, "password"), "'password' is write_only field and shouldn't be visible"
108+
109+
110+
@mark.django_db
111+
def test_write_only_field_using_extra_kwargs():
112+
class WriteOnlyFieldModelSerializer(serializers.ModelSerializer):
113+
class Meta:
114+
model = MyFakeModelWithPassword
115+
fields = ["cool_name", "password"]
116+
extra_kwargs = {"password": {"write_only": True}}
117+
118+
class MyMutation(SerializerMutation):
119+
class Meta:
120+
serializer_class = WriteOnlyFieldModelSerializer
121+
122+
result = MyMutation.mutate_and_get_payload(
123+
None, mock_info(), **{"cool_name": "New Narf", "password": "admin"}
124+
)
125+
126+
assert hasattr(result, "cool_name")
127+
assert not hasattr(result, "password"), "'password' is write_only field and shouldn't be visible"
128+
129+
89130
def test_nested_model():
90131
class MyFakeModelGrapheneType(DjangoObjectType):
91132
class Meta:

0 commit comments

Comments
 (0)