Skip to content

Add support for write_only fields in SerializerMutation #555

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions graphene_django/rest_framework/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,8 @@
class MyFakeModel(models.Model):
cool_name = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True)


class MyFakeModelWithPassword(models.Model):
cool_name = models.CharField(max_length=50)
password = models.CharField(max_length=50)
5 changes: 4 additions & 1 deletion graphene_django/rest_framework/mutation.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ def fields_for_serializer(serializer, only_fields, exclude_fields, is_input=Fals
name
in exclude_fields # or
# name in already_created_fields
) or (
field.write_only and not is_input # don't show write_only fields in Query
)

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

kwargs = {}
for f, field in serializer.fields.items():
kwargs[f] = field.get_attribute(obj)
if not field.write_only:
kwargs[f] = field.get_attribute(obj)

return cls(errors=None, **kwargs)
43 changes: 42 additions & 1 deletion graphene_django/rest_framework/tests/test_mutation.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from rest_framework import serializers

from ...types import DjangoObjectType
from ..models import MyFakeModel
from ..models import MyFakeModel, MyFakeModelWithPassword
from ..mutation import SerializerMutation


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


@mark.django_db
def test_write_only_field():
class WriteOnlyFieldModelSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)

class Meta:
model = MyFakeModelWithPassword
fields = ["cool_name", "password"]

class MyMutation(SerializerMutation):
class Meta:
serializer_class = WriteOnlyFieldModelSerializer

result = MyMutation.mutate_and_get_payload(
None, mock_info(), **{"cool_name": "New Narf", "password": "admin"}
)

assert hasattr(result, "cool_name")
assert not hasattr(result, "password"), "'password' is write_only field and shouldn't be visible"


@mark.django_db
def test_write_only_field_using_extra_kwargs():
class WriteOnlyFieldModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyFakeModelWithPassword
fields = ["cool_name", "password"]
extra_kwargs = {"password": {"write_only": True}}

class MyMutation(SerializerMutation):
class Meta:
serializer_class = WriteOnlyFieldModelSerializer

result = MyMutation.mutate_and_get_payload(
None, mock_info(), **{"cool_name": "New Narf", "password": "admin"}
)

assert hasattr(result, "cool_name")
assert not hasattr(result, "password"), "'password' is write_only field and shouldn't be visible"


def test_nested_model():
class MyFakeModelGrapheneType(DjangoObjectType):
class Meta:
Expand Down