#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.

Reply via email to