Skip to main content

Django REST framework (DRF) serializer speedup

Project description

Django REST framework serializers speedup

PyPI version Build Status Coverage Status

Simple short-living cache implementation for DRF serializers. It solves two issues with DRF serializers:

  • Serializer.fields property can be extremely slow in some cases. Such cases include complex ModelSerializer, serializer hierarchies with repeated serializers and recursive serializers. fields is cached and computed once per class for each serialization run. This leads to limitation - fields should not be dynamically adjusted inside of serializer, which inherits from SerializerCacheMixin;
  • 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

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

drf_serializer_cache-0.3.4-py2.py3-none-any.whl (11.4 kB view details)

Uploaded Python 2 Python 3

drf_serializer_cache-0.3.4-py2.7.egg (22.6 kB view details)

Uploaded Source

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

Hashes for drf_serializer_cache-0.3.4-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 b4b9347b2bb28882ce577b236f6dd5008ad66baf0466e0aee3cdda6224b06764
MD5 0aa6e637cd20ce3105cbb1491961891e
BLAKE2b-256 a40e9ec87f2d813ad2ed7c40d96ba29b373a2619ebe64f70db393e98a37c0ed2

See more details on using hashes here.

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: Source
  • 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

Hashes for drf_serializer_cache-0.3.4-py2.7.egg
Algorithm Hash digest
SHA256 66b5d31afa3229e300499b2c230d76ab5be125bee6594bbc826fe51edbbc2fb5
MD5 ff64af83d01cff626067d60901913758
BLAKE2b-256 302de5ccec6e12adf23d94e54607bfd3e3f52ca3a7235a6fdf5aa6c7eeb574b6

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page