#29092: Issues with ManyToMany Models for different apps with same table names
-------------------------------------------------+------------------------
               Reporter:  Elizaveta Kishchukova  |          Owner:  nobody
                   Type:  Uncategorized          |         Status:  new
              Component:  Uncategorized          |        Version:  1.11
               Severity:  Normal                 |       Keywords:
           Triage Stage:  Unreviewed             |      Has patch:  0
    Needs documentation:  0                      |    Needs tests:  0
Patch needs improvement:  0                      |  Easy pickings:  0
                  UI/UX:  0                      |
-------------------------------------------------+------------------------
 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.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29092>
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/049.b8af9d5d0743637b4616b0961345a8b0%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to