Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Support index_together during model creation

  • Loading branch information...
commit ae19315b4d8a19eda07ea8f313c485ca0a7875d0 1 parent 21be9fe
@andrewgodwin andrewgodwin authored
View
9 django/db/backends/schema.py
@@ -210,6 +210,15 @@ def create_model(self, model):
"definition": ", ".join(column_sqls)
}
self.execute(sql, params)
+ # Add any index_togethers
+ for fields in model._meta.index_together:
+ columns = [model._meta.get_field_by_name(field)[0].column for field in fields]
+ self.execute(self.sql_create_index % {
+ "table": self.quote_name(model._meta.db_table),
+ "name": self._create_index_name(model, columns, suffix="_idx"),
+ "columns": ", ".join(self.quote_name(column) for column in columns),
+ "extra": "",
+ })
# Make M2M tables
for field in model._meta.local_many_to_many:
self.create_model(field.rel.through)
View
5 django/db/backends/sqlite3/introspection.py
@@ -168,7 +168,10 @@ def get_primary_key_column(self, cursor, table_name):
"""
# Don't use PRAGMA because that causes issues with some transactions
cursor.execute("SELECT sql FROM sqlite_master WHERE tbl_name = %s AND type = %s", [table_name, "table"])
- results = cursor.fetchone()[0].strip()
+ row = cursor.fetchone()
+ if row is None:
+ raise ValueError("Table %s does not exist" % table_name)
+ results = row[0].strip()
results = results[results.index('(') + 1:results.rindex(')')]
for field_desc in results.split(','):
field_desc = field_desc.strip()
View
9 tests/schema/models.py
@@ -62,6 +62,15 @@ class Meta:
app_cache = new_app_cache
+class TagIndexed(models.Model):
+ title = models.CharField(max_length=255)
+ slug = models.SlugField(unique=True)
+
+ class Meta:
+ app_cache = new_app_cache
+ index_together = [["slug", "title"]]
+
+
class TagUniqueRename(models.Model):
title = models.CharField(max_length=255)
slug2 = models.SlugField(unique=True)
View
19 tests/schema/tests.py
@@ -6,7 +6,7 @@
from django.db.models.fields import IntegerField, TextField, CharField, SlugField
from django.db.models.fields.related import ManyToManyField, ForeignKey
from django.db.transaction import atomic
-from .models import Author, AuthorWithM2M, Book, BookWithSlug, BookWithM2M, Tag, TagUniqueRename, UniqueTest
+from .models import Author, AuthorWithM2M, Book, BookWithSlug, BookWithM2M, Tag, TagIndexed, TagUniqueRename, UniqueTest
class SchemaTests(TransactionTestCase):
@@ -503,6 +503,23 @@ def test_index_together(self):
),
)
+ def test_create_index_together(self):
+ """
+ Tests creating models with index_together already defined
+ """
+ # Create the table
+ with connection.schema_editor() as editor:
+ editor.create_model(TagIndexed)
+ # Ensure there is an index
+ self.assertEqual(
+ True,
+ any(
+ c["index"]
+ for c in connection.introspection.get_constraints(connection.cursor(), "schema_tagindexed").values()
+ if c['columns'] == ["slug", "title"]
+ ),
+ )
+
def test_db_table(self):
"""
Tests renaming of the table
Please sign in to comment.
Something went wrong with that request. Please try again.