每隔一段时间,您就需要在Django中重命名模型(或者,在我遇到的最近一个案例中,将一个模型拆分为两个,使用新的/不同的名称)。是的,正确的计划有助于避免这种情况,但有时候现实会介入。
重命名数据库中的相应表并修复受影响的代码后,仍然存在一个问题:授予用户或组以对这些模型进行操作的任何权限仍引用旧的模型名称。是否有任何自动或半自动的方法来解决这个问题,还是只是手动数据库手术的问题? (在开发中,你可以删除auth_permissions表和syncdb来重新创建它,但生产并不那么简单。)
答案 0 :(得分:2)
这里填写了缺少的内容类型和权限a snippet。我想知道是否可以扩展到至少做一些驴工作来清理auth_permissions。
答案 1 :(得分:2)
如果您碰巧使用了南模式迁移来重命名表,则前向迁移中的以下行将自动完成此操作:
db.send_create_signal('appname', ['modelname'])
答案 2 :(得分:1)
我最近遇到过这个问题并写了一个函数来解决它。如果重命名模型/表,则通常会与ContentType和Permission表存在差异。 Django有内置的帮助函数来解决这个问题,您可以按照以下方式使用它们:
from django.contrib.auth.management import create_permissions
from django.contrib.contenttypes.management import update_all_contenttypes
from django.db.models import get_apps
def update_all_content_types_and_permissions():
for app in get_apps():
create_permissions(app, None, 2)
update_all_contenttypes()
答案 3 :(得分:0)
我得到了一个很长的答案中途,详细说明了我将在这种情况下采取的攻击计划,但正如我写的那样,我意识到在这种情况下可能没有任何方法可以进行维护停机
您可以通过准备好loaddata脚本来最小化停机时间,但需要注意确保auth_perms主键同步。
另见简答:没有自动的方法来做我知道的事情。
答案 4 :(得分:0)
我在应用程序中更改了详细名称,在Django 2.2.7中,这是我发现修复权限的唯一方法:
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import Permission
class Command(BaseCommand):
help = 'Fixes permissions names'
def handle(self, *args, **options):
for p in Permission.objects.filter(content_type__app_label="your_app_label_here"):
p.name = "Can %s %s"%(p.codename.split('_')[0], p.content_type.model_class()._meta.verbose_name)
p.save()