Commit f8c040e1 authored by Markus Holtermann's avatar Markus Holtermann
Browse files

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

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

Regression introduced in 3d4a8261

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.
parent 37b50db0
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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:
+7 −4
Original line number Diff line number Diff line
@@ -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)
+3 −0
Original line number Diff line number Diff line
@@ -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`).