Allow for custom instantiation of input serializer

This commit is contained in:
Abdulhaq Emhemmed 2017-07-24 16:44:57 +02:00
parent cec1a84480
commit 412747d632
2 changed files with 34 additions and 2 deletions

View File

@ -19,3 +19,29 @@ You can create a Mutation based on a serializer by using the
class Meta: class Meta:
serializer_class = MySerializer serializer_class = MySerializer
Customizing the mutation
--------
By default, when the serializer is instantiated, only the input argument
is passed. Sometimes, the Django `request` object is required in the serializer
context. In fact, any sort of complicated serializer will probably require something
like `request.user`. This can be performed by customizing the instantiation
method as such:
.. code:: python
from graphene_django.rest_framework.mutation import SerializerMutation
class MySecondAwesomeMutation(SerializerMutation):
@classmethod
def instantiate_serializer(cls, instance, args, request, info):
input = args.get('input')
return cls._meta.serializer_class(data=dict(input),
context={'request': request})
class Meta:
serializer_class = MySerializer

View File

@ -105,12 +105,18 @@ class SerializerMutation(six.with_metaclass(SerializerMutationMeta, Mutation)):
description='May contain more than one error for ' description='May contain more than one error for '
'same field.' 'same field.'
) )
@classmethod
def instantiate_serializer(cls, instance, args, request, info):
input = args.get('input')
return cls._meta.serializer_class(data=dict(input))
@classmethod @classmethod
def mutate(cls, instance, args, request, info): def mutate(cls, instance, args, request, info):
input = args.get('input')
serializer = cls._meta.serializer_class(data=dict(input)) serializer = cls.instantiate_serializer(instance, args, request, info)
if serializer.is_valid(): if serializer.is_valid():
return cls.perform_mutate(serializer, info) return cls.perform_mutate(serializer, info)