This package allows you to customize your django-rest-framework serializer i/o to make modern frontend frameworks happy.
Project description
drf-payload-customizer
This package allows you to customize your django-rest-framework
serializer i/o to make modern frontend frameworks happy.
The following modifications are supported:
- Transformation: Convert all
keys
in API output tocamelCase
. Also on reception of an input on an API, transform all inputs tosnake_case
. - Translation: Rename a
key
in your API schema. (works in both direction). - Nullify/Balankify: Replace
""
withNone
on output direction and vice versa in the other direction.
We introduce 3 seperate Mixins
that can you can subclass your APIView
from to achieve 1-3. They are:
PayloadTransformationMixin
: Perform transformation (1) above. Has an optional parameterPAYLOAD_TRANSFORM_NESTED
(see tests) which you can set toTrue
in yourSerializer.Meta
class to recursively convert all nested dictionaries. This feature only works in the output direction.PayloadTranslationMixin
: Perform translation (2) above. You can specify custom mappings using afield_mappings
dict in yourSerializer.Meta
class.PayloadNoNullOrNoneMixin
: Perform nullify/blankify (3) above.
Requirements
The mixin
requires you to have the following dependencies:
djangorestframework==3.8.2
We are positive it would work with other versions of Django Rest Framework
as well. However, you will require Django==2.1.2
to run the unit tests.
Use it in your project
You can use all three of the mixins together like this in your project using
our drf_payload_customizer.mixins.PayloadConverterMixin
mixin. The mixin
performs (1-3) modifications listed above. Here is how it is implemented:
class PayloadConverterMixin(PayloadTransformationMixin,
PayloadTranslationMixin,
PayloadNoNullOrNoneMixin):
"""
Use this mixin in all of our Serializers, to convert the JSON into a
format that is easier consumed by modern front-ends.
"""
def to_representation(self, instance):
return super().to_representation(instance)
def to_internal_value(self, camel_cased):
return super().to_internal_value(camel_cased)
Now, subclass your APIViews
with PayloadConverterMixin
as given below:
from drf_payload_customizer.mixins import PayloadConverterMixin
class CustomTestModelSerializer(PayloadConverterMixin, ModelSerializer):
class Meta:
model = TestModel
fields = ('parama', 'param_b',)
PAYLOAD_TRANSFORM_NESTED = True
# The mapping is the snake_case of your expected o/p
field_mappings = {
'parama': 'param_a'
}
# Now your serializer would output:
test_serializer = CustomTestModelSerializer(obj)
JSONRenderer().render(test_serializer.data)
> {'paramA': '', 'paramB': None}
# Your serializer also admits input in the same format:
content = json.dumps({'paramA': 'testA', 'paramB': 3}).encode()
stream = BytesIO(content)
data = JSONParser().parse(stream)
serializer = CustomTestModelSerializer(data=data)
self.assertTrue(serializer.is_valid())
> True
To run tests
cd drf_payload_customizer # Make sure you change to a virutal environment according to your project setup python setup.py install pip install -r requirements.txt cd tests/test_app/ python manage.py test
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size drf-payload-customizer-0.0.4.tar.gz (4.8 kB) | File type Source | Python version None | Upload date | Hashes View |
Hashes for drf-payload-customizer-0.0.4.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 811ac3bbd6eb8e1dc0cbf4f888f090e96e3a5e129fa9fcd7fd4405030c4419be |
|
MD5 | 8a3b83c61202232724fcbb3ff687bd84 |
|
BLAKE2-256 | e3c6d765a1d431a47316dd3570721f9ac52cccb437cfff604bef270ee171dbd7 |