Skip to content

Commit

Permalink
use to_representation in favor of get_attribute (#848)
Browse files Browse the repository at this point in the history
* use `to_represenation` in favor of `get_attribute`

* fix datetime type does get converted to a string

to_representation will convert the datetime field into a string representation. However the to_representation on the method field will only call its underlying method.

* fix add missing import

* apply black formatter

* add test for serializer method field

* apply black format

* improve backward compatibility

by using date's class contructor instead of fromisostring

* apply black format

* fix black format issue
  • Loading branch information
B4rtware committed Feb 21, 2020
1 parent d1a9444 commit 6a19ab5
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 2 deletions.
5 changes: 5 additions & 0 deletions graphene_django/rest_framework/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,8 @@ class MyFakeModel(models.Model):
class MyFakeModelWithPassword(models.Model):
cool_name = models.CharField(max_length=50)
password = models.CharField(max_length=50)


class MyFakeModelWithDate(models.Model):
cool_name = models.CharField(max_length=50)
last_edited = models.DateField()
6 changes: 5 additions & 1 deletion graphene_django/rest_framework/mutation.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from collections import OrderedDict

from django.shortcuts import get_object_or_404
from rest_framework import serializers

import graphene
from graphene.relay.mutation import ClientIDMutation
Expand Down Expand Up @@ -158,6 +159,9 @@ def perform_mutate(cls, serializer, info):
kwargs = {}
for f, field in serializer.fields.items():
if not field.write_only:
kwargs[f] = field.get_attribute(obj)
if isinstance(field, serializers.SerializerMethodField):
kwargs[f] = field.to_representation(obj)
else:
kwargs[f] = field.get_attribute(obj)

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

from ...settings import graphene_settings
from ...types import DjangoObjectType
from ..models import MyFakeModel, MyFakeModelWithPassword
from ..models import MyFakeModel, MyFakeModelWithPassword, MyFakeModelWithDate
from ..mutation import SerializerMutation


Expand All @@ -33,6 +33,18 @@ class Meta:
fields = "__all__"


class MyModelSerializerWithMethod(serializers.ModelSerializer):
days_since_last_edit = serializers.SerializerMethodField()

class Meta:
model = MyFakeModelWithDate
fields = "__all__"

def get_days_since_last_edit(self, obj):
now = datetime.date(2020, 1, 8)
return (now - obj.last_edited).days


class MyModelMutation(SerializerMutation):
class Meta:
serializer_class = MyModelSerializer
Expand Down Expand Up @@ -208,6 +220,23 @@ class Meta:
assert '"id" required' in str(exc.value)


@mark.django_db
def test_perform_mutate_success():
class MyMethodMutation(SerializerMutation):
class Meta:
serializer_class = MyModelSerializerWithMethod

result = MyMethodMutation.mutate_and_get_payload(
None,
mock_info(),
**{"cool_name": "Narf", "last_edited": datetime.date(2020, 1, 4)}
)

assert result.errors is None
assert result.cool_name == "Narf"
assert result.days_since_last_edit == 4


def test_mutate_and_get_payload_error():
class MyMutation(SerializerMutation):
class Meta:
Expand Down

0 comments on commit 6a19ab5

Please sign in to comment.