#22931: Migrations cannot rename intermediate models
-------------------------------------+-------------------------------------
     Reporter:  JockeTF              |      Owner:  nobody
         Type:  Bug                  |     Status:  new
    Component:  Database layer       |    Version:  1.7-rc-1
  (models, ORM)                      |   Keywords:  migrations migrate
     Severity:  Normal               |  makemigrations rename intermediate
 Triage Stage:  Unreviewed           |  model
Easy pickings:  0                    |  Has patch:  0
                                     |      UI/UX:  0
-------------------------------------+-------------------------------------
 Due to a change in naming conventions I needed to rename an intermediate
 model. I renamed a model from Subscriber to Subscribe.

 {{{#!python
 from django.db import models
 from django.conf import settings


 class Channel(models.Model):
         name = models.CharField(max_length=128)
         subscribers = models.ManyToManyField(settings.AUTH_USER_MODEL,
 through='Subscribe', related_name='subscriptions')
         date_created = models.DateTimeField(auto_now_add=True)


 class Subscribe(models.Model):
         user = models.ForeignKey(settings.AUTH_USER_MODEL)
         channel = models.ForeignKey(Channel)
         date_subscribed = models.DateTimeField(auto_now_add=True)

         class Meta():
                 unique_together = ('user', 'channel')
 }}}

 Running makemigrations in Django 1.7c1 results in an exception.

 {{{#!python
   0002_auto_20140701_0817.py:
     - Create model Subscribe
     - Alter unique_together for subscribe (1 constraints)
 Traceback (most recent call last):
   File "./manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/__init__.py", line 385, in
 execute_from_command_line
     utility.execute()
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/__init__.py", line 377, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/base.py", line 288, in run_from_argv
     self.execute(*args, **options.__dict__)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/base.py", line 337, in execute
     output = self.handle(*args, **options)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/commands/makemigrations.py", line 115, in
 handle
     self.write_migration_files(changes)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/commands/makemigrations.py", line 131, in
 write_migration_files
     self.stdout.write("    - %s\n" % operation.describe())
   File "/usr/local/lib/python3.4/dist-
 packages/django/db/migrations/operations/models.py", line 251, in describe
     return "Alter %s for %s (%s constraints)" % (self.option_name,
 self.name, len(self.unique_together))
 TypeError: object of type 'NoneType' has no len()
 }}}

 In Django 1.7b3 makemigrations actually worked.

 {{{#!python
 from django.db import models, migrations
 from django.conf import settings


 class Migration(migrations.Migration):
         dependencies = [
                 ('api', '0002_auto_20140630_1443'),
         ]

         operations = [
                 migrations.RenameModel(
                         old_name='Subscriber',
                         new_name='Subscribe',
                 ),
                 migrations.AlterField(
                         model_name='channel',
                         name='subscribers',
 field=models.ManyToManyField(through='api.Subscribe',
 to=settings.AUTH_USER_MODEL),
                 ),
         ]
 }}}

 However, running migrate in Django 1.7b3 results in another exception.

 {{{#!python
 Running migrations:
   Applying api.0013_subscriber_renamed...Traceback (most recent call
 last):
   File "/usr/local/lib/python3.4/dist-packages/django/apps/config.py",
 line 152, in get_model
     return self.models[model_name.lower()]
 KeyError: 'subscriber'

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "/usr/local/lib/python3.4/dist-
 packages/django/db/migrations/state.py", line 78, in render
     model = self.apps.get_model(lookup_model[0], lookup_model[1])
   File "/usr/local/lib/python3.4/dist-packages/django/apps/registry.py",
 line 190, in get_model
     return self.get_app_config(app_label).get_model(model_name.lower())
   File "/usr/local/lib/python3.4/dist-packages/django/apps/config.py",
 line 155, in get_model
     "App '%s' doesn't have a '%s' model." % (self.label, model_name))
 LookupError: App 'api' doesn't have a 'subscriber' model.

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "./manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/__init__.py", line 385, in
 execute_from_command_line
     utility.execute()
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/__init__.py", line 377, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/base.py", line 288, in run_from_argv
     self.execute(*args, **options.__dict__)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/base.py", line 337, in execute
     output = self.handle(*args, **options)
   File "/usr/local/lib/python3.4/dist-
 packages/django/core/management/commands/migrate.py", line 146, in handle
     executor.migrate(targets, plan, fake=options.get("fake", False))
   File "/usr/local/lib/python3.4/dist-
 packages/django/db/migrations/executor.py", line 62, in migrate
     self.apply_migration(migration, fake=fake)
   File "/usr/local/lib/python3.4/dist-
 packages/django/db/migrations/executor.py", line 96, in apply_migration
     migration.apply(project_state, schema_editor)
   File "/usr/local/lib/python3.4/dist-
 packages/django/db/migrations/migration.py", line 107, in apply
     operation.database_forwards(self.app_label, schema_editor,
 project_state, new_state)
   File "/usr/local/lib/python3.4/dist-
 packages/django/db/migrations/operations/models.py", line 141, in
 database_forwards
     new_apps = to_state.render()
   File "/usr/local/lib/python3.4/dist-
 packages/django/db/migrations/state.py", line 88, in render
     model=lookup_model,
 ValueError: Lookup failed for model referenced by field
 api.Channel.subscribers: api.Subscriber
 }}}

 The same exception is thrown if I move the migration generated in Django
 1.7b3 to Django 1.7c1.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/22931>
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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/050.9c51fb8ff1803ce320ec8bc2b8088b83%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to