5👍
Thanks to previous posts, I went with a similar solution based off get_serializer_class
for this.
I also wanted to be able to change the serializer class depending on method.
First, I added an attribute to the view class with a dictionary mapping request methods to serializer classes.
serializer_classes = {
'GET': NestedSerializer,
'POST': FlatSerializer
}
Then, I defined a mixin to use where I want this behavior.
class SwappableSerializerMixin(object):
def get_serializer_class(self):
try:
return self.serializer_classes[self.request.method]
except AttributeError:
logger.debug('%(cls)s does not have the required serializer_classes'
'property' % {'cls': self.__class__.__name__})
raise AttributeError
except KeyError:
logger.debug('request method %(method)s is not listed'
' in %(cls)s serializer_classes' %
{'cls': self.__class__.__name__,
'method': self.request.method})
# required if you don't include all the methods (option, etc) in your serializer_class
return super(SwappableSerializerMixin, self).get_serializer_class() es
3👍
I had the same problem and it looks like quite a few others have it too. Carlton Gibson answer actually lead me to my hacky solution. I ended up using a ModelSerializer with the depth set and created the following mixin to use in the views.
class ReadNestedWriteFlatMixin(object):
"""
Mixin that sets the depth of the serializer to 0 (flat) for writing operations.
For all other operations it keeps the depth specified in the serializer_class
"""
def get_serializer_class(self, *args, **kwargs):
serializer_class = super(ReadNestedWriteFlatMixin, self).get_serializer_class(*args, **kwargs)
if self.request.method in ['PATCH', 'POST', 'PUT']:
serializer_class.Meta.depth = 0
return serializer_class
1👍
The simplest thing that occurs to me is to override get_serializer_class()
on your view for POST/PUT to return a modified serializer not specifying the depth parameter and using a PrimaryKeyRelatedField for your languages
field.
- How to display "This many months ago" in Django using Humanize?
- Django __call__() missing 1 required keyword-only argument: 'manager'
- Django: correctly retrieve data where date and time are greater than now