From 901af865505310a70dd02ea5b3becbf45819b652 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Wed, 19 Sep 2012 10:06:53 -0600 Subject: 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. --- tests/modeltests/get_or_create/tests.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'tests') 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) -- cgit v1.3