What’s new in django-cachalot?
2.9.0
Add support for Django 6.0 and Python 3.8-3.14 (#277)
Fix #280 CachalotPanel not working in Django Debug Toolbar (#277)
Fix Recursion Issue in AtomicCache (Issue #274)
Allow custom databases (#247)
2.8.0
Add a setting for disabling iterator caching (#263)
Add support for testing against the builtin redis backend (#264)
Add Django 5.2 support to tox configuration (#272)
2.7.0
Add support for caching queries with enum filters (#267)
2.6.3
Support for Django 5.1
2.6.2
Support for Python 3.12 and Django 5.0
2.6.1
Hot fix when Django is externally imported due to connections import (#242)
2.6.0
Dropped Django 2.2 and 4.0 support
Added Django 4.2 and Python 3.11 support
Added psycopg support (#229)
Updated tests to account for the BEGIN and COMMIT query changes in Django 4.2
Standardized django version comparisons in tests
2.5.3
Verify get_meta isn’t none before requesting db_table (#225 #226)
2.5.2
Added Django 4.1 support (#217)
2.5.1
Table invalidation condition enhanced (#213)
Add test settings to sdist (#203)
Include docs in sdist (#202)
2.5.0
Add final SQL check to include potentially overlooked tables when looking up involved tables (#199)
Add
CACHALOT_FINAL_SQL_CHECKfor enabling Final SQL check
2.4.5
Dropped Python 3.6 and Django 3.1 support. Added Django 4.0 support (#208)
2.4.4
Handle queryset implementations without lhs/rhs attribute (#204)
Add Python 3.10 support (#206)
(Internal) Omit additional unnecessary code in coverage
2.4.3
Fix annotated Now being cached (#195)
Fix conditional annotated expressions not being cached (#196)
Simplify annotation handling by using the flatten method (#197)
Fix Django 3.2 default_app_config deprecation (#198)
(Internal) Pinned psycopg2 to <2.9 due to Django 2.2 incompatibility
2.4.2
Add convenience settings CACHALOT_ONLY_CACHABLE_APPS and CACHALOT_UNCACHABLE_APPS (#187)
Drop support for Django 3.0 (#189)
(Internal) Added Django main-branch CI on cron job
(Internal) Removed duplicate code (#190)
2.4.1
Fix Django requirement constraint to include 3.2.X not just 3.2
(Internal) Deleted obsolete travis-matrix.py file
2.4.0
Add support for Django 3.2 (#181)
Remove enforced system check for Django version (#175)
Drop support for Django 2.0-2.1 and Python 3.5 (#181)
Add support for Pymemcache for Django 3.2+ (#181)
Reverts #157 with proper fix. (#181)
Add
CACHALOT_ADDITIONAL_TABLESsetting for unmanaged models (#183)
2.3.5
Fix cachalot_disabled (#174)
2.3.4
Fix bug with externally invalidated cache keys (#120)
Omit test files in coverage
2.3.3
Remove deprecated signal argument (#165)
Add Python 3.9 support
Use Discord instead since Slack doesn’t save messages, @Andrew-Chen-Wang is not on there very much, and Discord has a phenomenal search functionality (with ES).
2.3.2
Cast memoryview objects to bytes to be able to pickle them (#163)
2.3.1
Added support for Django 3.1, including the new, native JSONField
2.3.0
Added context manager for temporarily disabling cachalot using cachalot_disabled()
Fix for certain Subquery cases.
2.2.2
Drop support for Django 1.11 and Python 2.7
Added fix for subqueries from Django 2.2
2.2.0
Adds Django 2.2 and 3.0 support.
Dropped official support for Python 3.4
It won’t run properly with Travis CI tests on MySQL.
All Travis CI tests are fully functional.
2.1.0
Adds Django 2.1 support.
2.0.2
Adds support for
.union,.intersection&.differencethat should have been introduced since 1.5.0Fixes error raised in some rare and undetermined cases, when the cache backend doesn’t yield data as expected
2.0.1
Allows specifying a schema name in
Model._meta.db_table
2.0.0
Adds Django 2.0 support
Drops Django 1.10 support
Drops Django 1.8 support (1.9 support was dropped in 1.5.0)
Adds a check to make sure it is used with a supported Django version
Fixes a bug partially breaking django-cachalot when an error occurred during the end of a transaction.atomic block, typically when using deferred constraints
1.5.0
Adds Django 1.11 support
Adds Python 3.6 support
Drops Django 1.9 support (but 1.8 is still supported)
Drops Python 3.3 support
Adds
CACHALOT_DATABASESto specify which databases have django-cachalot enabled (by default, only supported databases are enabled)Stops advising users to dynamically override cachalot settings as it cannot be thread-safe due to Django’s internals
Invalidates tables after raw
CREATE,ALTER&DROPSQL queriesAllows specifying model lookups like
auth.Userin the API functions (previously, it could only be done in the Django template tag, not in the Jinja2get_last_invalidationfunction nor in API functions)Fixes the cache used by
CachalotPanelifCACHALOT_CACHEis different from'default'Uploads a wheel distribution of this package to PyPI starting now, in addition of the source release
Improves tests
1.4.1
Fixes a circular import occurring when CachalotPanel is used and django-debug-toolbar is before django-cachalot in
INSTALLED_APPSStops checking compatibility for caches other than
CACHALOT_CACHE
1.4.0
Fixes a bad design:
QuerySet.select_for_updatewas cached, but it’s not correct since it does not lock data in the database once data was cached, leading to the database lock being useless in some casesStops automatically invalidating other caches than
CACHALOT_CACHEfor consistency, performance, and usefulness reasonsFixes a minor issue: the
post_invalidationsignal was sent during transactions when calling theinvalidatecommandCreates a gitter chat room
Removes the Slack team. Slack does not allow public chat, this was therefore a bad idea
1.3.0
Adds Django 1.10 support
Drops Django 1.7 support
Drops Python 3.2 support
Adds a Jinja2 extension with a
cachestatement and theget_last_invalidationfunctionAdds a
CACHALOT_TIMEOUTsetting after dozens of private & public requests, but it’s not really usefulFixes a
RuntimeErroroccurring if aDatabaseCachewas used in a project, even if not used by django-cachalotAllows bytes raw queries (except on SQLite where it’s not supposed to work)
Creates a Slack team to discuss, easier than using Google Groups
1.2.1
Mandatory update if you’re using django-cachalot 1.2.0.
This version reverts the cache keys hashing change from 1.2.0,
as it was leading to a non-shared cache when Python used a random seed
for hashing, which is the case by default on Python 3.3, 3.4, & 3.5,
and also on 2.7 & 3.2 if you set PYTHONHASHSEED=random.
1.2.0
WARNING: This version is unsafe, it can lead to invalidation errors
Adds Django 1.9 support
Simplifies and speeds up cache keys hashing
Documents how to use django-cachalot with a replica database
Adds
DummyCachetoVALID_CACHE_BACKENDSUpdates the comparison with django-cache-machine & django-cacheops by checking features and measuring performance instead of relying on their documentations and a 2-years-ago experience of them
1.1.0
Backwards incompatible changes:
Adds Django 1.8 support and drops Django 1.6 & Python 2.6 support
Merges the 3 API functions
invalidate_all,invalidate_tables, &invalidate_modelsinto a singleinvalidatefunction while optimising it
Other additions:
Adds a
get_last_invalidationfunction to the API and the equivalent template tagAdds a
CACHALOT_ONLY_CACHABLE_TABLESsetting in order to make a whitelist of the only table names django-cachalot can cacheCaches queries with IP addresses, floats, or decimals in parameters
Adds a Django check to ensure the project uses compatible cache and database backends
Adds a lot of tests, especially to test django.contrib.postgres
Adds a comparison with django-cache-machine and django-cacheops in the documentation
Fixed:
Removes a useless extra invalidation during each write operation to the database, leading to a small speedup during data modification and tests
The
post_invalidationsignal was triggered during transactions and was not triggered when using the API or raw write queries: both issues are now fixedFixes a very unlikely invalidation issue occurring only when an error occurred in a transaction after a transaction of another database nested in the first transaction was committed, like this:
from django.db import transaction assert list(YourModel.objects.using('another_db')) == [] try: with transaction.atomic(): with transaction.atomic('another_db'): obj = YourModel.objects.using('another_db').create(name='test') raise ZeroDivisionError except ZeroDivisionError: pass # Before django-cachalot 1.1.0, this assert was failing. assert list(YourModel.objects.using('another_db')) == [obj]
1.0.3
Fixes an invalidation issue that could rarely occur when querying on a
BinaryFieldwith PostgreSQL, or with some geographic queries (there was a small chance that a same query with different parameters could erroneously give the same result as the previous one)Adds a
CACHALOT_UNCACHABLE_TABLESsettingFixes a Django 1.7 migrations invalidation issue in tests (that was leading to this error half of the time:
RuntimeError: Error creating new content types. Please make sure contenttypes is migrated before trying to migrate apps individually.)Optimises tests when using django-cachalot by avoid several useless cache invalidations
1.0.2
Fixes an
AttributeErroroccurring when excluding through a many-to-many relation on a child model (using multi-table inheritance)Stops caching queries with random subqueries – for example
User.objects.filter(pk__in=User.objects.order_by('?'))Optimises automatic invalidation
Adds a note about clock synchronisation
1.0.1
Fixes an invalidation issue discovered by Helen Warren that was occurring when updating a
ManyToManyFieldafter executing using.excludeon that relation. For example,Permission.objects.all().delete()was not invalidatingUser.objects.exclude(user_permissions=None)Fixes a
UnicodeDecodeErrorintroduced with python-memcached 1.54Adds a
post_invalidationsignal
1.0.0
Fixes a bug occurring when caching a SQL query using a non-ascii table name.
1.0.0rc
Added:
Adds an invalidate_cachalot command to invalidate django-cachalot from a script without having to clear the whole cache
Adds the benchmark introduction, conditions & results to the documentation
Adds a short guide on how to configure Redis as a LRU cache
Fixed:
Fixes a rare invalidation issue occurring when updating a many-to-many table after executing a queryset generating a
HAVINGSQL statement – for example,User.objects.first().user_permissions.add(Permission.objects.first())was not invalidatingUser.objects.annotate(n=Count('user_permissions')).filter(n__gte=1)Fixes an even rarer invalidation issue occurring when updating a many-to-many table after executing a queryset filtering nested subqueries by another subquery through that many-to-many table – for example:
User.objects.filter( pk__in=User.objects.filter( pk__in=User.objects.filter( user_permissions__in=Permission.objects.all())))
Avoids setting useless cache keys by using table names instead of Django-generated table alias
0.9.0
Added:
Caches all queries implying
Queryset.extraInvalidates raw queries
Adds a simple API containing:
invalidate_tables,invalidate_models,invalidate_allAdds file-based cache support for Django 1.7
Adds a setting to choose if random queries must be cached
Adds 2 settings to customize how cache keys are generated
Adds a django-debug-toolbar panel
Adds a benchmark
Fixed:
Rewrites invalidation for a better speed & memory performance
Fixes a stale cache issue occurring when an invalidation is done exactly during a SQL request on the invalidated table(s)
Fixes a stale cache issue occurring after concurrent transactions
Uses an infinite timeout
Removed:
Simplifies
cachalot_settingsand forbids its use or modification
0.8.1
Fixes an issue with pip if Django is not yet installed
0.8.0
Adds multi-database support
Adds invalidation when altering the DB schema using migrate, syncdb, flush, loaddata commands (also invalidates South, if you use it)
Small optimizations & simplifications
Adds several tests
0.7.0
Adds thread-safety
Optimizes the amount of cache queries during transaction
0.6.0
Adds memcached support
0.5.0
Adds
CACHALOT_ENABLED&CACHALOT_CACHEsettingsAllows settings to be dynamically overridden using
cachalot_settingsAdds some missing tests
0.4.1
Fixes
pip install.
0.4.0 (install broken)
Adds Travis CI and adds compatibility for:
Django 1.6 & 1.7
Python 2.6, 2.7, 3.2, 3.3, & 3.4
locmem & Redis
SQLite, PostgreSQL, MySQL
0.3.0
Handles transactions
Adds lots of tests for complex cases
0.2.0
Adds a test suite
Fixes invalidation for data creation/deletion
Stops caching on queries defining
selectorwherearguments withQuerySet.extra
0.1.0
Prototype simply caching all SQL queries reading the database and trying to invalidate them when SQL queries modify the database.
Has issues invalidating deletions and creations.
Also caches QuerySet.extra queries but can’t reliably invalidate them.
No transaction support, no test, no multi-database support, etc.