【问题标题】:Why django creates new default permissions even with default_permissions=() in the Meta?为什么 django 即使在 Meta 中使用 default_permissions=() 也会创建新的默认权限?
【发布时间】:2019-08-16 13:02:43
【问题描述】:

我设置了一些测试应用来检查 django 的行为。

用于测试的Makefile:

clean:
    rm db.sqlite3

mig_model:
    python manage.py migrate flights 0001

mig_all:
    python manage.py migrate

show1 show2:
    python manage.py shell -c "from django.contrib.auth.models import Permission; print(list(Permission.objects.values_list('id', 'codename')))"

all: clean mig_model show1 mig_all show2
  • 删除旧数据库
  • 迁移到创建第一个自己的模型时
  • 迁移后应在 post_migrate 信号中创建默认权限。但我在 Model.Meta 中指定不应创建默认权限
  • 检查所有权限 - 我可以看到它们确实是生成的
  • 迁移其他所有内容,这只是我删除系统中所有权限的另外 1 次数据迁移
  • 再次显示所有权限,我可以看到旧权限已被删除并在迁移后创建了新权限(它们都有新的 id)

models.py:

class Schedule(models.Model):
    flight_day = models.DateField()

    class Meta:
        default_permissions = ()
        permissions = ()

make all的输出

.venv ❯ make all
rm db.sqlite3
python manage.py migrate flights 0001
Operations to perform:
  Target specific migration: 0001_initial, from flights
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying flights.0001_initial... OK
python manage.py shell -c "from django.contrib.auth.models import Permission; print(list(Permission.objects.values_list('id', 'codename')))"
[(5, 'add_group'), (6, 'change_group'), (7, 'delete_group'), (8, 'view_group'), (1, 'add_permission'), (2, 'change_permission'), (3, 'delete_permission'), (4, 'view_permission'), (9, 'add_user'), (10, 'change_user'), (11, 'delete_user'), (12, 'view_user'), (13, 'add_contenttype'), (14, 'change_contenttype'), (15, 'delete_contenttype'), (16, 'view_contenttype'), (17, 'add_schedule'), (18, 'change_schedule'), (19, 'delete_schedule'), (20, 'view_schedule'), (21, 'add_scheduleperf'), (22, 'change_scheduleperf'), (23, 'delete_scheduleperf'), (24, 'view_scheduleperf')]
python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, flights, sessions
Running migrations:
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying flights.0002_delete_perms...DELETE ALL (24, {'auth.Group_permissions': 0, 'auth.User_user_permissions': 0, 'auth.Permission': 24})
 OK
  Applying sessions.0001_initial... OK
python manage.py shell -c "from django.contrib.auth.models import Permission; print(list(Permission.objects.values_list('id', 'codename')))"
[(25, 'add_logentry'), (26, 'change_logentry'), (27, 'delete_logentry'), (28, 'view_logentry'), (33, 'add_group'), (34, 'change_group'), (35, 'delete_group'), (36, 'view_group'), (29, 'add_permission'), (30, 'change_permission'), (31, 'delete_permission'), (32, 'view_permission'), (37, 'add_user'), (38, 'change_user'), (39, 'delete_user'), (40, 'view_user'), (41, 'add_contenttype'), (42, 'change_contenttype'), (43, 'delete_contenttype'), (44, 'view_contenttype'), (49, 'add_schedule'), (50, 'change_schedule'), (51, 'delete_schedule'), (52, 'view_schedule'), (53, 'add_scheduleperf'), (54, 'change_scheduleperf'), (55, 'delete_scheduleperf'), (56, 'view_scheduleperf'), (45, 'add_session'), (46, 'change_session'), (47, 'delete_session'), (48, 'view_session')]

【问题讨论】:

    标签: django


    【解决方案1】:

    来自 Django 文档:

    这些权限会在你运行 manage.py migrate 时创建;这 将 django.contrib.auth 添加到后第一次运行迁移 INSTALLED_APPS,将为所有用户创建默认权限 以前安装的型号,以及任何新型号 当时安装的。之后,它将创建默认权限 对于每次运行 manage.py migrate 的新模型(该函数 创建权限连接到 post_migrate 信号)。

    代码:

    default_permissions = ()
    

    不会阻止这种情况发生。

    如果我知道更多您想要做的事情,我可能会提供更好的帮助。

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2020-08-28
      • 2012-12-11
      • 2011-04-14
      • 2013-05-16
      • 2020-01-03
      • 2017-11-11
      • 1970-01-01
      相关资源
      最近更新 更多