Never caches `select_for_update` queries.
This commit is contained in:
parent
dbbc4ff4c8
commit
c5d5ee7907
|
@ -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'))
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue