Django REST framework (DRF) serializer speedup
Project description
Django REST framework serializers speedup
Simple short-living cache implementation for DRF serializers. It solves two issues with DRF serializers:
Serializer.fieldsproperty can be extremely slow in some cases. Such cases include complexModelSerializer, serializer hierarchies with repeated serializers and recursive serializers.fieldsis cached and computed once per class for each serialization run. This leads to limitation -fieldsshould not be dynamically adjusted inside of serializer, which inherits fromSerializerCacheMixin;- By default serializers will re-compute object representation event if they encounter same object with same serializer twice. This can turn into an issue, if multiple object include same dependent hard-to-serialize objects. Cache avoid re-computing instance representation if it encounters same instances multiple times.
Performance results
Cache life-time and invalidation
Cache is designed to be simple and non-error-prone.
Cache is created when top-level serializer to_representation starts
and is cleaned up once this method is finished. Thus there is no need
for timeouts or complex cache invalidation. No data is shared between
requests.
Thus, following cases will work fine:
user = User.objects.get(name='Lee')
data_1 = UserSerializer(user).data
# OrderedDict([('name', 'Lee')])
user.name = 'Bob'
user.save()
data_2 = UserSerializer(user).data
# OrderedDict([('name', 'Bob')])
Usage
Usage should be pretty simple - inject SerializerCacheMixin before
inheriting from Serializer or ModelSerializer:
from drf_serializer_cache import SerializerCacheMixin
from rest_framework import serializers
class UserSerializer(SerializerCacheMixin, serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'name')
Common pitfalls
Too often cache cleanup
Cache lives in serializer hierarchy root, but it's life-time is defined
by nearest tree node, which inherits from SerializerCacheMixin.
Ideal situation is when root inherits from SerializerCacheMixin.
That's why SerializerCacheMixin uses custom list_serializer_class,
which also inherits from SerializerCacheMixin.
If you use custom list as root of serializer hierarchy - it's recommended
to use SerializerCacheMixin as it's base class.
Too many hierarchies
By default serializers build nice hierarchy by calling bind on their
child serializers. This case can be broken for serializers.SerializerMethodField
if it uses some serializer without calling bind on it:
from drf_serializer_cache import SerializerCacheMixin
from rest_framework import serializers
class ResultSerializer(SerializerCacheMixin, serializers.Serializer):
results = serializers.SerializerMethodField()
def get_results(self, instance):
# recursive serializer
serializer = self.__class__(instance.results, many=True)
serializer.bind('*', self) # bind call is essential for efficient cache !
return serializer.data
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drf_serializer_cache-0.3.4-py2.py3-none-any.whl.
File metadata
- Download URL: drf_serializer_cache-0.3.4-py2.py3-none-any.whl
- Upload date:
- Size: 11.4 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4b9347b2bb28882ce577b236f6dd5008ad66baf0466e0aee3cdda6224b06764
|
|
| MD5 |
0aa6e637cd20ce3105cbb1491961891e
|
|
| BLAKE2b-256 |
a40e9ec87f2d813ad2ed7c40d96ba29b373a2619ebe64f70db393e98a37c0ed2
|
File details
Details for the file drf_serializer_cache-0.3.4-py2.7.egg.
File metadata
- Download URL: drf_serializer_cache-0.3.4-py2.7.egg
- Upload date:
- Size: 22.6 kB
- Tags: Egg
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66b5d31afa3229e300499b2c230d76ab5be125bee6594bbc826fe51edbbc2fb5
|
|
| MD5 |
ff64af83d01cff626067d60901913758
|
|
| BLAKE2b-256 |
302de5ccec6e12adf23d94e54607bfd3e3f52ca3a7235a6fdf5aa6c7eeb574b6
|