Opened 8 years ago
Last modified 8 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 )
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.