Loading django/db/backends/postgresql_psycopg2/creation.py +2 −2 Original line number Diff line number Diff line Loading @@ -47,7 +47,8 @@ class DatabaseCreation(BaseDatabaseCreation): def sql_indexes_for_field(self, model, f, style): output = [] if f.db_index or f.unique: db_type = f.db_type(connection=self.connection) if db_type is not None and (f.db_index or f.unique): qn = self.connection.ops.quote_name db_table = model._meta.db_table tablespace = f.db_tablespace or model._meta.db_tablespace Loading @@ -73,7 +74,6 @@ class DatabaseCreation(BaseDatabaseCreation): # a second index that specifies their operator class, which is # needed when performing correct LIKE queries outside the # C locale. See #12234. db_type = f.db_type(connection=self.connection) if db_type.startswith('varchar'): output.append(get_index_sql('%s_%s_like' % (db_table, f.column), ' varchar_pattern_ops')) Loading tests/indexes/models.py +25 −0 Original line number Diff line number Diff line Loading @@ -2,10 +2,35 @@ from django.db import connection from django.db import models class CurrentTranslation(models.ForeignObject): """ Creates virtual relation to the translation with model cache enabled. """ # Avoid validation requires_unique_target = False def __init__(self, to, from_fields, to_fields, **kwargs): # Disable reverse relation kwargs['related_name'] = '+' # Set unique to enable model cache. kwargs['unique'] = True super(CurrentTranslation, self).__init__(to, from_fields, to_fields, **kwargs) class ArticleTranslation(models.Model): article = models.ForeignKey('indexes.Article') language = models.CharField(max_length=10, unique=True) content = models.TextField() class Article(models.Model): headline = models.CharField(max_length=100) pub_date = models.DateTimeField() # Add virtual relation to the ArticleTranslation model. translation = CurrentTranslation(ArticleTranslation, ['id'], ['article']) class Meta: index_together = [ ["headline", "pub_date"], Loading tests/indexes/tests.py +7 −0 Original line number Diff line number Diff line Loading @@ -29,3 +29,10 @@ class IndexesTests(TestCase): # unique=True and db_index=True should only create the varchar-specific # index (#19441). self.assertIn('("slug" varchar_pattern_ops)', index_sql[4]) @skipUnless(connection.vendor == 'postgresql', "This is a postgresql-specific issue") def test_postgresql_virtual_relation_indexes(self): """Test indexes are not created for related objects""" index_sql = connection.creation.sql_indexes_for_model(Article, no_style()) self.assertEqual(len(index_sql), 1) Loading
django/db/backends/postgresql_psycopg2/creation.py +2 −2 Original line number Diff line number Diff line Loading @@ -47,7 +47,8 @@ class DatabaseCreation(BaseDatabaseCreation): def sql_indexes_for_field(self, model, f, style): output = [] if f.db_index or f.unique: db_type = f.db_type(connection=self.connection) if db_type is not None and (f.db_index or f.unique): qn = self.connection.ops.quote_name db_table = model._meta.db_table tablespace = f.db_tablespace or model._meta.db_tablespace Loading @@ -73,7 +74,6 @@ class DatabaseCreation(BaseDatabaseCreation): # a second index that specifies their operator class, which is # needed when performing correct LIKE queries outside the # C locale. See #12234. db_type = f.db_type(connection=self.connection) if db_type.startswith('varchar'): output.append(get_index_sql('%s_%s_like' % (db_table, f.column), ' varchar_pattern_ops')) Loading
tests/indexes/models.py +25 −0 Original line number Diff line number Diff line Loading @@ -2,10 +2,35 @@ from django.db import connection from django.db import models class CurrentTranslation(models.ForeignObject): """ Creates virtual relation to the translation with model cache enabled. """ # Avoid validation requires_unique_target = False def __init__(self, to, from_fields, to_fields, **kwargs): # Disable reverse relation kwargs['related_name'] = '+' # Set unique to enable model cache. kwargs['unique'] = True super(CurrentTranslation, self).__init__(to, from_fields, to_fields, **kwargs) class ArticleTranslation(models.Model): article = models.ForeignKey('indexes.Article') language = models.CharField(max_length=10, unique=True) content = models.TextField() class Article(models.Model): headline = models.CharField(max_length=100) pub_date = models.DateTimeField() # Add virtual relation to the ArticleTranslation model. translation = CurrentTranslation(ArticleTranslation, ['id'], ['article']) class Meta: index_together = [ ["headline", "pub_date"], Loading
tests/indexes/tests.py +7 −0 Original line number Diff line number Diff line Loading @@ -29,3 +29,10 @@ class IndexesTests(TestCase): # unique=True and db_index=True should only create the varchar-specific # index (#19441). self.assertIn('("slug" varchar_pattern_ops)', index_sql[4]) @skipUnless(connection.vendor == 'postgresql', "This is a postgresql-specific issue") def test_postgresql_virtual_relation_indexes(self): """Test indexes are not created for related objects""" index_sql = connection.creation.sql_indexes_for_model(Article, no_style()) self.assertEqual(len(index_sql), 1)