| Version: | 0.9.3 |
|---|---|
| Docs: | https://django-dbcache-fields.readthedocs.io/ |
| Download: | https://pypi.python.org/pypi/django_dbcache_fields |
| Source: | https://github.com/maykinmedia/django-dbcache-fields |
| Keywords: | django, database, cache, methods, decorator |
This library provides a decorator dbcache that caches the result of your
Django Model methods in your database.
It adds a regular Field on your Model for each method that you
decorate. This means you can use all ORM-functions like aggregation and
migrations. You can use existing fields or let dbcache create the field
for you.
You can also invalidate the cached value by creating a _dirty_ function or by indicating which other models affect the this cached value. By default, the cached value is only updated when the model is saved.
You can install django_dbcache_fields either via the Python Package Index (PyPI) or from source.
To install using pip:
$ pip install -U django_dbcache_fieldsTo use this with your project you need to follow these steps:
Install the django_dbcache_fields library:
$ pip install django_dbcache_fieldsAdd
django_dbcache_fieldstoINSTALLED_APPSin your Django project'ssettings.py:INSTALLED_APPS = ( # ..., 'django_dbcache_fields', )
Note that there is no dash in the module name, only underscores.
All done. You can now decorate methods in your
Modelwith@dbcache.
Simple example to show what dbcache does:
from django.db import models
from django_dbcache_fields.decorators import dbcache
class Ingredient(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=4, decimal_places=2)
class Pizza(models.Model):
name = models.CharField(max_length=100)
ingredients = models.ManyToManyField(Ingredient)
@dbcache(models.DecimalField(max_digits=6, decimal_places=2,
blank=True, null=True), invalidated_by=['myapp.Ingredient'])
def get_price(self):
return self.ingredients.aggregate(total=Sum('price'))['total'] or Decimal()Every call to get_price would normally perform a database query to
calculate the total price of all ingredients. However, the dbcache
decorator caused a new field to be added to the model: A DecimalField that
can store the resulting value of the get_price function, so it doesn't
need to perform the same query over and over again.