#29092: Issues with ManyToMany Models for different apps with same table names
-------------------------------------+-------------------------------------
Reporter: Elizaveta | Owner: nobody
Kishchukova |
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 1.11
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Elizaveta Kishchukova:
Old description:
> 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 'app_name.table_name' for key.
New description:
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.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/29092#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/064.7f038e9a5017eafa2988d26c0cd433d9%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.