[1.7.x] Fixed #24236 -- Treated inherited m2m fields as such if they don't define get_internal_type()

Regression introduced in 3d4a826174b7a411a03be39725e60c940944a7fe

Thanks IRC user ris for the report, Loïc Bistuer, Anssi Kääriäinen and
Andriy Sokolovskiy for the discussion and Tim Graham for the review.
This commit is contained in:
Markus Holtermann 2015-01-28 12:13:54 +01:00
parent 37b50db092
commit f8c040e167
3 changed files with 15 additions and 6 deletions

View File

@ -3,6 +3,7 @@ import operator
from django.db.backends.creation import BaseDatabaseCreation
from django.db.backends.utils import truncate_name
from django.db.models.fields.related import ManyToManyField
from django.db.transaction import atomic
from django.utils.encoding import force_bytes
from django.utils.log import getLogger
@ -358,7 +359,8 @@ class BaseDatabaseSchemaEditor(object):
table instead (for M2M fields)
"""
# Special-case implicit M2M tables
if field.get_internal_type() == 'ManyToManyField' and field.rel.through._meta.auto_created:
if ((isinstance(field, ManyToManyField) or field.get_internal_type() == 'ManyToManyField') and
field.rel.through._meta.auto_created):
return self.create_model(field.rel.through)
# Get the column's definition
definition, params = self.column_sql(model, field, include_default=True)
@ -402,7 +404,8 @@ class BaseDatabaseSchemaEditor(object):
but for M2Ms may involve deleting a table.
"""
# Special-case implicit M2M tables
if field.get_internal_type() == 'ManyToManyField' and field.rel.through._meta.auto_created:
if ((isinstance(field, ManyToManyField) or field.get_internal_type() == 'ManyToManyField') and
field.rel.through._meta.auto_created):
return self.delete_model(field.rel.through)
# It might not actually have a column behind it
if field.db_parameters(connection=self.connection)['type'] is None:

View File

@ -4,6 +4,7 @@ from decimal import Decimal
from django.utils import six
from django.apps.registry import Apps
from django.db.backends.schema import BaseDatabaseSchemaEditor
from django.db.models.fields.related import ManyToManyField
class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
@ -69,7 +70,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
for field in create_fields:
body[field.name] = field
# Choose a default and insert it into the copy map
if not field.get_internal_type() == 'ManyToManyField':
if not (isinstance(field, ManyToManyField) or field.get_internal_type() == 'ManyToManyField'):
mapping[field.column] = self.quote_value(
self.effective_default(field)
)
@ -92,7 +93,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
del body[field.name]
del mapping[field.column]
# Remove any implicit M2M tables
if field.get_internal_type() == 'ManyToManyField' and field.rel.through._meta.auto_created:
if ((isinstance(field, ManyToManyField) or field.get_internal_type() == 'ManyToManyField') and
field.rel.through._meta.auto_created):
return self.delete_model(field.rel.through)
# Work inside a new app registry
apps = Apps()
@ -171,7 +173,8 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
table instead (for M2M fields)
"""
# Special-case implicit M2M tables
if field.get_internal_type() == 'ManyToManyField' and field.rel.through._meta.auto_created:
if ((isinstance(field, ManyToManyField) or field.get_internal_type() == 'ManyToManyField') and
field.rel.through._meta.auto_created):
return self.create_model(field.rel.through)
self._remake_table(model, create_fields=[field])
@ -181,7 +184,7 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
but for M2Ms may involve deleting a table.
"""
# M2M fields are a special case
if field.get_internal_type() == 'ManyToManyField':
if isinstance(field, ManyToManyField) or field.get_internal_type() == 'ManyToManyField':
# For implicit M2M tables, delete the auto-created table
if field.rel.through._meta.auto_created:
self.delete_model(field.rel.through)

View File

@ -13,3 +13,6 @@ Bugfixes
``contrib.contenttypes``s or ``contrib.auth``s first migration
(:ticket:`24075`) due to severe impact on the test performance
(:ticket:`24251`) and problems in multi-database setups (:ticket:`24298`).
* Fixed a regression that prevented custom fields inheriting from
``ManyToManyField`` from being recognized in migrations (:ticket:`24236`).