Never caches `select_for_update` queries.

This commit is contained in:
Bertrand Bordage 2016-09-29 11:57:38 +02:00
parent dbbc4ff4c8
commit c5d5ee7907
2 changed files with 17 additions and 2 deletions

View File

@ -526,6 +526,9 @@ class ReadTestCase(TransactionTestCase):
@skipUnlessDBFeature('has_select_for_update')
def test_select_for_update(self):
"""
Tests if ``select_for_update`` queries are not cached.
"""
with self.assertRaises(TransactionManagementError):
list(Test.objects.select_for_update())
@ -536,13 +539,24 @@ class ReadTestCase(TransactionTestCase):
self.assertListEqual([t.name for t in data1],
['test1', 'test2'])
with self.assertNumQueries(0):
with self.assertNumQueries(1):
with transaction.atomic():
data2 = list(Test.objects.select_for_update())
self.assertListEqual(data2, [self.t1, self.t2])
self.assertListEqual([t.name for t in data2],
['test1', 'test2'])
with self.assertNumQueries(2):
with transaction.atomic():
data3 = list(Test.objects.select_for_update())
data4 = list(Test.objects.select_for_update())
self.assertListEqual(data3, [self.t1, self.t2])
self.assertListEqual(data4, [self.t1, self.t2])
self.assertListEqual([t.name for t in data3],
['test1', 'test2'])
self.assertListEqual([t.name for t in data4],
['test1', 'test2'])
def test_having(self):
with self.assertNumQueries(1):
data1 = list(User.objects.annotate(n=Count('user_permissions'))

View File

@ -154,7 +154,8 @@ def filter_cachable(tables):
def _get_tables(query, db_alias):
if '?' in query.order_by and not cachalot_settings.CACHALOT_CACHE_RANDOM:
if ('?' in query.order_by and not cachalot_settings.CACHALOT_CACHE_RANDOM) \
or query.select_for_update:
raise UncachableQuery
tables = set(query.table_map)