#22833 closed Bug (fixed)
1.7 migrations can't delete codependent "through" models
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | Migrations | Version: | 1.7-beta-2 |
| Severity: | Release blocker | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Hi,
I'm using Django 1.7b4, and I'm testing the migrations. I have this existing model in the database:
class BlocksList(Named, Ordered):
blocks_list_assignments = models.ManyToManyField(
Block,
through='BlocksListAssignment'
)
family = models.ForeignKey(
BlockFamily,
verbose_name=_("Family Name"),
null=True,
blank=True,
)
def __str__(self): # Python 3: def __str__(self):
return self.name
class BlocksListAssignment(Ordered):
block = models.ForeignKey(Block)
block_list = models.ForeignKey(BlocksList)
def __str__(self): # Python 3: def __str__(self):
return self.block_list.name + ": %s" % self.block
I'm trying to delete this with the makemigrations/migrate command, with this in my migrations file:
migrations.DeleteModel(
name='BlocksList',
),
migrations.DeleteModel(
name='BlocksListAssignment',
),
It looks like the co-dependencies prevent the migrations from deleting both models, because I constantly get:
Running migrations:
Applying blocks.0014_auto_20140613_2227...Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/apps/config.py", line 152, in get_model
return self.models[model_name.lower()]
KeyError: 'blockslistassignment'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/db/migrations/state.py", line 76, in render
model = self.apps.get_model(lookup_model[0], lookup_model[1])
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/apps/registry.py", line 190, in get_model
return self.get_app_config(app_label).get_model(model_name.lower())
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/apps/config.py", line 155, in get_model
"App '%s' doesn't have a '%s' model." % (self.label, model_name))
LookupError: App 'blocks' doesn't have a 'blockslistassignment' 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 "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/core/management/__init__.py", line 427, in execute_from_command_line
utility.execute()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/core/management/__init__.py", line 419, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/core/management/base.py", line 337, in execute
output = self.handle(*args, **options)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 146, in handle
executor.migrate(targets, plan, fake=options.get("fake", False))
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/db/migrations/executor.py", line 62, in migrate
self.apply_migration(migration, fake=fake)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/db/migrations/executor.py", line 90, in apply_migration
if self.detect_soft_applied(migration):
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/db/migrations/executor.py", line 134, in detect_soft_applied
apps = project_state.render()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/db/migrations/state.py", line 86, in render
model=lookup_model,
ValueError: Lookup failed for model referenced by field blocks.BlocksList.blocks_list_assignments: blocks.BlocksListAssignment
Anyways to get around this I have to recreate the database and start from fixtures.
Do let me know if there is another way where I can use the migrations directly.
This is on Mac OS X 10.9, Python 3.4.0, Django 1.7b4, and PostGRES 9.3.4 database.
Change History (3)
comment:1 by , 11 years ago
| Severity: | Normal → Release blocker |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
comment:2 by , 11 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Hi,
I can indeed reproduce your issue with the following simplified models (the problem appears on
masteras well):After running an initial
makemigrations && migrate, I delete the first two models, then runmakemigrations(which works, producing essentially the same migration as the one you describe). After that, runningmigratetriggers aKeyErrorlike the one you reported.I'll bump the severity to
release blockersince this use-case should be perfectly valid.Thanks.