Clearing specific cache in Django

From django cache docs, it says that cache.delete('key') should be enough. So, it comes to my mind two problems you might have:

  1. Your imports are not correct, remember that you have to import cache from the django.core.cache module:

    from django.core.cache import cache
    
    # ...
    cache.delete('my_url')
    
  2. The key you're using is not correct (maybe it uses the full url, including "domain.com"). To check which is the exact url you can go into your shell:

    $ ./manage.py shell
    >>> from django.core.cache import cache
    >>> cache.has_key('/post/1234/')
    # this will return True or False, whether the key was found or not
    # if False, keep trying until you find the correct key ...
    >>> cache.has_key('domain.com/post/1234/') # including domain.com ?
    >>> cache.has_key('www.domain.com/post/1234/') # including www.domain.com ?
    >>> cache.has_key('/post/1234') # without the trailing / ?
    

I make a function to delete key starting with some text. This help me to delete dynamic keys.

list posts cached

def get_posts(tag, page=1):
    cached_data = cache.get('list_posts_home_tag%s_page%s' % (tag, page))
    if not cached_data:
        cached_data = mycontroller.get_posts(tag, page)
        cache.set('list_posts_home_tag%s_page%s' % (tag, page), cached_data, 60)
    return cached_data

when update any post, call flush_cache

def update(data):
    response = mycontroller.update(data)
    flush_cache('list_posts_home')
    return response

flush_cache to delete any dynamic cache

def flush_cache(text):
    for key in list(cache._cache.keys()):
        if text in key:
            cache.delete(key.replace(':1:', ''))

Do not forget to import cache from django

from django.core.cache import cache