summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCarl Meyer <carl@oddbird.net>2012-09-19 10:06:53 -0600
committerCarl Meyer <carl@oddbird.net>2012-09-19 10:06:53 -0600
commit901af865505310a70dd02ea5b3becbf45819b652 (patch)
tree81ac520a776fb9aaa12f831a23c202ce5b19baf6 /tests
parent44767f2caf028d89e1a283d04bb552d0e18bb936 (diff)
Fixed #16865 -- Made get_or_create use read database for initial get query.
Thanks Rick van Hattem for the report and trbs for the patch.
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/get_or_create/tests.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/modeltests/get_or_create/tests.py b/tests/modeltests/get_or_create/tests.py
index 1e300fbb4d..cc7d2c29ab 100644
--- a/tests/modeltests/get_or_create/tests.py
+++ b/tests/modeltests/get_or_create/tests.py
@@ -64,3 +64,27 @@ class GetOrCreateTests(TestCase):
formatted_traceback = traceback.format_exc()
self.assertIn('obj.save', formatted_traceback)
+
+ def test_initial_get_on_read_db(self):
+ """
+ get_or_create should only set _for_write when it's actually doing a
+ create action. This makes sure that the initial .get() will be able to
+ use a slave database. Specially when some form of database pinning is
+ in place this will help to not put all the SELECT queries on the
+ master. Refs #16865.
+
+ """
+ qs = Person.objects.get_query_set()
+ p, created = qs.get_or_create(
+ first_name="Stuart", last_name="Sutcliffe", defaults={
+ "birthday": date(1940, 6, 23),
+ }
+ )
+ self.assertTrue(created)
+ self.assertTrue(qs._for_write)
+
+ qs = Person.objects.get_query_set()
+ p, created = qs.get_or_create(
+ first_name="Stuart", last_name="Sutcliffe")
+ self.assertFalse(created)
+ self.assertFalse(qs._for_write)