def test_multiple_context_hints_w_multiple_select_related_multiple_prefetch_related( self): source = N(models.Source, id=1) source2 = N(models.Source, id=2) qsets = context_loader.get_querysets_for_context_hints({ source: { 'key': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk'], 'prefetch_related': ['fk_m2m'], }, }, source2: { 'key2': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk2'], }, } }) # Create objects to query in order to test optimal number of queries fk = G(test_models.TestFKModel) fk2 = G(test_models.TestFKModel2) o = G(test_models.TestModel, fk=fk, fk2=fk2) m2ms = [G(test_models.TestFKModel), G(test_models.TestFKModel)] o.fk_m2m.add(*m2ms) with self.assertNumQueries(2): v = qsets[test_models.TestModel].get(id=o.id) self.assertEquals(v.fk, fk) self.assertEquals(v.fk2, fk2) self.assertEquals(set(v.fk_m2m.all()), set(m2ms))
def test_multiple_context_hints_w_multiple_select_related_multiple_prefetch_related(self): source = N(models.Source, id=1) source2 = N(models.Source, id=2) qsets = context_loader.get_querysets_for_context_hints({ source: { 'key': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk'], 'prefetch_related': ['fk_m2m'], }, }, source2: { 'key2': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk2'], }, } }) # Create objects to query in order to test optimal number of queries fk = G(test_models.TestFKModel) fk2 = G(test_models.TestFKModel2) o = G(test_models.TestModel, fk=fk, fk2=fk2) m2ms = [G(test_models.TestFKModel), G(test_models.TestFKModel)] o.fk_m2m.add(*m2ms) with self.assertNumQueries(2): v = qsets[test_models.TestModel].get(id=o.id) self.assertEquals(v.fk, fk) self.assertEquals(v.fk2, fk2) self.assertEquals(set(v.fk_m2m.all()), set(m2ms))
def test_multiple_context_hints_w_multiple_select_related(self): source = N(models.Source, id=1) source2 = N(models.Source, id=2) qsets = context_loader.get_querysets_for_context_hints({ source: { 'key': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk'], }, }, source2: { 'key2': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk2'], }, } }) # Verify the raw sql to ensure select relateds will happen expected_sql = ( 'SELECT "tests_testmodel"."id", "tests_testmodel"."value", "tests_testmodel"."fk_id", ' '"tests_testmodel"."fk2_id", ' '"tests_testfkmodel"."id", "tests_testfkmodel"."value", ' '"tests_testfkmodel2"."id", "tests_testfkmodel2"."value" FROM "tests_testmodel" INNER JOIN ' '"tests_testfkmodel" ON ("tests_testmodel"."fk_id" = "tests_testfkmodel"."id") ' 'INNER JOIN "tests_testfkmodel2" ON ("tests_testmodel"."fk2_id" = "tests_testfkmodel2"."id")' ) actual_sql = str(qsets[test_models.TestModel].query) # Django < 1.7 and 1.8 have spaces before/after parentheses actual_sql = actual_sql.replace('( ', '(').replace(' )', ')') self.assertEquals(actual_sql, expected_sql)
def test_multiple_context_hints_w_multiple_select_related_multiple_prefetch_related(self): source = N(models.Source, id=1) source2 = N(models.Source, id=2) qsets = context_loader.get_querysets_for_context_hints({ source: { 'key': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk'], 'prefetch_related': ['fk_m2m'], }, }, source2: { 'key2': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk2'], }, } }) # Verify the raw sql to ensure select relateds will happen. Note that prefetch relateds are not # included in raw sql raw_sql = ( 'SELECT "tests_testmodel"."id", "tests_testmodel"."value", "tests_testmodel"."fk_id", ' '"tests_testmodel"."fk2_id", ' '"tests_testfkmodel"."id", "tests_testfkmodel"."value", ' '"tests_testfkmodel2"."id", "tests_testfkmodel2"."value" FROM "tests_testmodel" INNER JOIN ' '"tests_testfkmodel" ON ( "tests_testmodel"."fk_id" = "tests_testfkmodel"."id" ) ' 'INNER JOIN "tests_testfkmodel2" ON ( "tests_testmodel"."fk2_id" = "tests_testfkmodel2"."id" )' ) self.assertEquals(str(qsets[test_models.TestModel].query), raw_sql)
def test_one_context_hint_no_select_related(self): source = N(models.Source, id=1) qsets = context_loader.get_querysets_for_context_hints({ source: { 'key': { 'app_name': 'tests', 'model_name': 'TestModel', }, }, }) self.assertEquals( qsets, {test_models.TestModel: test_models.TestModel.objects})
def test_one_context_hint_no_select_related(self): source = N(models.Source, id=1) qsets = context_loader.get_querysets_for_context_hints({ source: { 'key': { 'app_name': 'tests', 'model_name': 'TestModel', }, }, }) self.assertEquals(qsets, { test_models.TestModel: test_models.TestModel.objects })
def test_one_context_hint_w_select_related(self): source = N(models.Source, id=1) qsets = context_loader.get_querysets_for_context_hints({ source: { 'key': { 'app_name': 'tests', 'model_name': 'TestModel', 'select_related': ['fk'], }, }, }) # Verify the raw sql to ensure select relateds will happen raw_sql = ( 'SELECT "tests_testmodel"."id", "tests_testmodel"."value", "tests_testmodel"."fk_id", ' '"tests_testmodel"."fk2_id", ' '"tests_testfkmodel"."id", "tests_testfkmodel"."value" FROM "tests_testmodel" INNER JOIN ' '"tests_testfkmodel" ON ( "tests_testmodel"."fk_id" = "tests_testfkmodel"."id" )' ) self.assertEquals(str(qsets[test_models.TestModel].query), raw_sql)
def test_no_context_hints(self): qsets = context_loader.get_querysets_for_context_hints({}) self.assertEquals(qsets, {})