mirror of
https://github.com/graphql-python/graphene-django.git
synced 2024-11-22 09:37:07 +03:00
use to_representation in favor of get_attribute (#848)
* 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
This commit is contained in:
parent
d1a9444401
commit
6a19ab5a4b
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
@ -158,6 +159,9 @@ class SerializerMutation(ClientIDMutation):
|
|||
kwargs = {}
|
||||
for f, field in serializer.fields.items():
|
||||
if not field.write_only:
|
||||
if isinstance(field, serializers.SerializerMethodField):
|
||||
kwargs[f] = field.to_representation(obj)
|
||||
else:
|
||||
kwargs[f] = field.get_attribute(obj)
|
||||
|
||||
return cls(errors=None, **kwargs)
|
||||
|
|
|
@ -8,7 +8,7 @@ from graphene.types.inputobjecttype import InputObjectType
|
|||
|
||||
from ...settings import graphene_settings
|
||||
from ...types import DjangoObjectType
|
||||
from ..models import MyFakeModel, MyFakeModelWithPassword
|
||||
from ..models import MyFakeModel, MyFakeModelWithPassword, MyFakeModelWithDate
|
||||
from ..mutation import SerializerMutation
|
||||
|
||||
|
||||
|
@ -33,6 +33,18 @@ class MyModelSerializer(serializers.ModelSerializer):
|
|||
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
|
||||
|
@ -208,6 +220,23 @@ def test_model_invalid_update_mutate_and_get_payload_success():
|
|||
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:
|
||||
|
|
Loading…
Reference in New Issue
Block a user