diff options
| author | Carl Meyer <carl@oddbird.net> | 2012-09-19 10:06:53 -0600 |
|---|---|---|
| committer | Carl Meyer <carl@oddbird.net> | 2012-09-19 10:06:53 -0600 |
| commit | 901af865505310a70dd02ea5b3becbf45819b652 (patch) | |
| tree | 81ac520a776fb9aaa12f831a23c202ce5b19baf6 /tests | |
| parent | 44767f2caf028d89e1a283d04bb552d0e18bb936 (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.py | 24 |
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) |
