Opened 6 years ago

Last modified 6 years ago

#29092 closed Bug

Issues with ManyToMany Models for different apps with same table names — at Version 1

Reported by: Elizaveta Kishchukova Owned by: nobody
Component: Database layer (models, ORM) Version: 1.11
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Elizaveta Kishchukova)

This code results in errors during integrity checks when there are apps using models with same m2m table name.

in django/db/models/fields/related.py, lines 1441-1453:

    def _check_table_uniqueness(self, **kwargs):
        if isinstance(self.remote_field.through, six.string_types) or not self.remote_field.through._meta.managed:
            return []
        registered_tables = {
            model._meta.db_table: model
            for model in self.opts.apps.get_models(include_auto_created=True)
            if model != self.remote_field.through and model._meta.managed
        }    
        m2m_db_table = self.m2m_db_table()
        model = registered_tables.get(m2m_db_table)
        # The second condition allows multiple m2m relations on a model if
        # some point to a through model that proxies another through model.
        if model and model._meta.concrete_model != self.remote_field.through._meta.concrete_model:

Example:

Set up:
app1.SomeModel with table name "some_table_name" (using database 1)
app2.SomeModel with table name "some_table_name" (using database 2)
app1.Y with field xs = models.ManyToManyField('X', through='SomeModel')
app2.Y with field xs = models.ManyToManyField('X', through='SomeModel')

ERRORS: 
app1.Y.xs: (fields.E340) The field's intermediary table 'some_table_name' clashes with the table name of 'app2.SomeModel'.
app2.Y.xs: (fields.E340) The field's intermediary table 'some_table_name' clashes with the table name of 'app1.SomeModel'.

Notice how it compares models of different apps. This dictionary ought to at least use something like 'database.table_name' or 'app_name.table_name' for key.

Change History (1)

comment:1 by Elizaveta Kishchukova, 6 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top