Opened 6 years ago

Closed 6 years ago

#23628 closed Bug (wontfix)

AlterModelOptions should check for changes

Reported by: Richard Eames Owned by: nobody
Component: Migrations Version: 1.7
Severity: Normal Keywords:
Cc: github@… Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Consider the following model:

PERM_DEFS = {
   ('perm1', 'Desc1') : 123,
   ('perm2', 'Desc2') : 321
}
class Spam(models.Model):
    class Meta:
        permissions = list(PERM_DEFS.keys())

Currently, running makemigrations will always generate a new migration even though the permissions list doesn't change. Perhaps the inspector could do a set(old_attr) == set(new_attr) type operation on list style attributes such as permissions and default_permissions.

Current workaround is: permissions = list(sorted(PERM_DEFS.keys()))

Change History (3)

comment:1 Changed 6 years ago by Baptiste Mispelon

Hi,

This actually depends on your Python version.
On Python 3.3 and later, the order of dictionaries will change between different runs (that feature is called "hash randomization" if you want to look deeper).

On earlier versions of Python though, that order is consistent so the autodetector doesn't see any changes and no new migrations are created.

I'm not sure if this warrants the additional code complexity.
If you need a consistent order here you could use an OrderedDict or user permissions = sorted(PERM_DEFS.keys()).

comment:2 Changed 6 years ago by Richard Eames

I don't think there's that much extra complexity: one possible solution: https://github.com/django/django/pull/3356

comment:3 Changed 6 years ago by Tim Graham

Resolution: wontfix
Status: newclosed

I don't think there's a good reason to say the ordering of permissions isn't important. For example, you might have a migration that indexes the permissions tuple to get a particular permission. Using sorted() as Baptiste suggested seems like the best solution to me.

Note: See TracTickets for help on using tickets.
Back to Top