Example #1
0
    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))
Example #3
0
    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_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)
Example #6
0
 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)
Example #9
0
 def test_no_context_hints(self):
     qsets = context_loader.get_querysets_for_context_hints({})
     self.assertEquals(qsets, {})
 def test_no_context_hints(self):
     qsets = context_loader.get_querysets_for_context_hints({})
     self.assertEquals(qsets, {})