Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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

  • Loading branch information...
commit 78c32f1caa9cb9b28be2d867aff586a2016122ed 1 parent 9a46836
@ziima ziima authored timgraham committed
View
4 django/db/backends/postgresql_psycopg2/creation.py
@@ -47,7 +47,8 @@ def sql_table_creation_suffix(self):
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 @@ def get_index_sql(index_name, opclass=''):
# 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'))
View
25 tests/indexes/models.py
@@ -2,10 +2,35 @@
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"],
View
7 tests/indexes/tests.py
@@ -29,3 +29,10 @@ def test_postgresql_text_indexes(self):
# 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)
Please sign in to comment.
Something went wrong with that request. Please try again.