Opened 21 months ago
Last modified 21 months ago
#35199 closed Bug
Makemigrations raises KeyError when removing a field from Meta.unique_together when its a list — at Initial Version
| Reported by: | Paco Martínez | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | 4.2 |
| Severity: | Normal | Keywords: | migrations, unique_together, makemigrations |
| Cc: | Paco Martínez | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Having a model like this, with a unique_together with a list of lists:
from django.db import models
class MyModel(models.Model):
field1 = models.CharField(max_length=50)
field2 = models.IntegerField()
field3 = models.DateField()
class Meta:
unique_together=[['field1', 'field2', 'field3']]
If we want to remove one of the fields from the constraint like:
class Meta:
unique_together=[['field1', 'field2']]
When we run the makemigrations command, it raises a KeyError. This is the traceback:
Traceback (most recent call last):
File "/code/manage.py", line 26, in <module>
main()
File "/code/manage.py", line 22, in main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.12/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.12/site-packages/django/core/management/__init__.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 412, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 458, in execute
output = self.handle(*args, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 106, in wrapper
res = handle_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/django/core/management/commands/makemigrations.py", line 233, in handle
changes = autodetector.changes(
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/django/db/migrations/autodetector.py", line 46, in changes
changes = self._detect_changes(convert_apps, graph)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/django/db/migrations/autodetector.py", line 192, in _detect_changes
self.generate_removed_altered_unique_together()
File "/usr/local/lib/python3.12/site-packages/django/db/migrations/autodetector.py", line 1506, in generate_removed_altered_unique_together
self._generate_removed_altered_foo_together(operations.AlterUniqueTogether)
File "/usr/local/lib/python3.12/site-packages/django/db/migrations/autodetector.py", line 1481, in _generate_removed_altered_foo_together
for (
File "/usr/local/lib/python3.12/site-packages/django/db/migrations/autodetector.py", line 1462, in _get_altered_foo_together_operations
field = new_model_state.get_field(field_name)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/django/db/migrations/state.py", line 765, in get_field
return self.fields[field_name]
~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'field1'
This does NOT happen when the unique_together option is a tuple. It works as expected creating the migration.
Note:
See TracTickets
for help on using tickets.