TLDR
Is there a way to mark cached values so I could do something like:
cache.filter('some_tag').clear()
Details
In my project I have the following model:
class Item(models.Model):
month = models.DateField('month', null=False, blank=False, db_index=True)
kg = models.BigIntegerField('kg')
tags = models.ManyToManyField('Tag', related_name='items')
// bunch of other fields used to filter data
And I have a report_view
that returns the sum of kg
by month and by tag according to the filters
supplied in the URL
query.
Something like this:
--------------------------------
|Tag |jan |fev |mar |
--------------------------------
|Tag 1 |1000 |1500 |2000 |
--------------------------------
|Tag 2 |1235 |4652 |0 |
--------------------------------
As my Item
table has already more than 4 million records and is always growing my report_view
is cached.
So far I got all of this covered.
The problem is: the site user can change the tags
from the Items
and every time this occurs I have to invalidate the cache, but I would like to do it in a more granular way.
For example if a user changes a tag
in a Item
from january
that should invalidate all the totals for that month (I prefer to cache by month because sometimes changing one tag
has a cascading effect on others). However I don't know all the views that have been cached as there are thousands of possibilities of different filters that change the URL
.
What I have done so far:
- Set a signal to invalidate all my caches when a
tag
changes
@receiver(m2m_changed, sender=Item.tags.through) def tags_changed(sender, **kwargs): cache.clear()
But this cleans everything which is not optimal in my case. Is there a way of doing something like cache.filter('some_tag').clear()
with Django cache framework?