Package: drf-cached-instances
Speed upDjango REST Framework(DRF) reads by storing instance data in cache.This code was split frombrowsercompat.  You may be interested in
viewing the browsercompat source code for a full example implementation.Code:https://github.com/jwhitlock/drf-cached-instancesFree software:Mozilla Public License Version 2.0Documentation:https://drf-cached-instances.readthedocs.ioHow it worksIn a normal DRF view, a Django queryset is used to load an object or list of
objects.  A serializer is used to convert the objects into the “native”
representation, and then a renderer works on this native representation.  If
the serializer includes data from related models, then multiple database
queries may be required to generate a native representation.  Some database
efficiency can be gained by usingselect_related, but a minimum of one query
is needed, which is unfortunate for an API with heavy read usage.This project replaces the Django queryset with a cache-aware proxy class,
making it possible to serve a read request with zero database requests (to
retrieve an instance) or one request (to get the primary keys for a list view).
It is suitable for APIs with heavy read operations and lots of linking between
related instances.When using the cache, Django objects are serialized to JSON.  Only the
attributes needed for the DRF native representation are stored in the cache.
This include the JSON representation of fields such as foreign keys, reverse
relations, and dates and times.  These serialized objects are stored by primary
key in the cache.  When an instance is found in the cache, no database reads
are needed to render the DRF representation.  If the instance is not in the
cache, it is serialized and stored, so that future reads will be faster.The API implementor writes methods to handle JSON serialization, loading from
the database, and identifying invalid cache entries on changes.  There are a
few integration points, including a mixin for views to load data from the cache.
With only a few changes to existing code, your read views could be a lot faster.Project statusThis code is used for thebrowsercompatproject, which was developed from 2015
- 2016, but is on hold as of August 2016. Since this was the primary user of
this code, it may be a while before more features are implemented.History0.3.4 (2016-08-14)Drop support for Django 1.7, Python 2.6Expand tests to Django 1.10, Django REST Framework 3.4, Python 3.50.3.3 (2015-11-05)Add serializer for datetime.timedelta, to support Django 1.8’s
DurationField (creynold)Convert string representations of datetimes, dates, and timedeltasExpand tests to Django 1.9 beta 1 and Django REST Framework 3.30.3.2 (2015-09-23)Remove deprecation warning in Django 1.8Expand tests to Django master and Django REST Framework 3.2Fix invalid mock.patch tests that break under mock 1.3.0Documentation updates and fixes0.3.1 (2015-06-16)Move get_object_or_404 to mixin method, to allow easier extending.0.3.0 (2015-04-09)Tested with Django 1.8Tested with Django REST Framework 2.4, 3.0, and 3.1CachedModel now supports .pk attribute as an alias, usually to the .id
field. DRF 3 uses .pk to determine if a model is saved to database, and
returns empty relation data for unsaved fields.cache.delete_all_versions() will delete all cached instances of a model and
PK. This is useful when changes are made outside of normal requests, such as
during a data migration.0.2.0 (2014-12-11)Addupdate_onlyoption tocache.update_instance, to support eventual
consistency for cold caches.0.1.0 (2014-11-06)First release on PyPI.