Commit 78c32f1c authored by Vlastimil Zíma's avatar Vlastimil Zíma Committed by Tim Graham
Browse files

Fixed #22514 -- Prevented indexes on virtual fields [postgres].

parent 9a46836a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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
@@ -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'))
+25 −0
Original line number Diff line number Diff line
@@ -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"],
+7 −0
Original line number Diff line number Diff line
@@ -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)