gpt4 book ai didi

python - Django 1.7 数据迁移和用户组

转载 作者:太空狗 更新时间:2023-10-29 20:56:09 25 4
gpt4 key购买 nike

我正在尝试使用 django 1.7 native 迁移系统实现数据迁移。这是我所做的。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations


def create_basic_user_group(apps, schema_editor):
"""Forward data migration that create the basic_user group

"""
Group = apps.get_model('auth', 'Group')
Permission = apps.get_model('auth', 'Permission')
group = Group(name='basic_user')
group.save()

perm_codenames = (
'add_stuff',
'...',
)

# we prefere looping over all these in order to be sure to fetch them all
perms = [Permission.objects.get(codename=codename)
for codename in perm_codenames]

group.permissions.add(*perms)
group.save()


def remove_basic_user_group(apps, schema_editor):
"""Backward data migration that remove the basic_user group

"""
group = Group.objects.get(name='basic_user')
group.delete()


class Migration(migrations.Migration):
"""This migrations automatically create the basic_user group.

"""

dependencies = [
]

operations = [
migrations.RunPython(create_basic_user_group, remove_basic_user_group),
]

但是当我尝试运行迁移时,我收到一个 LookupError 异常,告诉我找不到标签为“auth”的应用。

如何以一种干净的方式创建我的组,这种方式也可以用于单元测试?

最佳答案

我已经完成了您想要做的事情。问题是:

  1. 1.7 的文档和 1.8很清楚:如果你想从另一个应用程序访问模型,你必须将这个应用程序列为依赖项:

    When writing a RunPython function that uses models from apps other than the one in which the migration is located, the migration’s dependencies attribute should include the latest migration of each app that is involved, otherwise you may get an error similar to: LookupError: No installed app with label 'myappname' when you try to retrieve the model in the RunPython function using apps.get_model().

    所以你应该依赖于 auth 中的最新迁移。

  2. 正如您在 comment 中提到的那样您会遇到一个问题,即您要使用的权限尚未创建。问题是权限是由附加到 post_migrate 信号的信号处理程序创建的。因此,在迁移完成之前,与迁移中创建的任何模型关联的权限都不可用。

    您可以通过在 create_basic_user_group 的开头执行此操作来解决此问题:

    from django.contrib.contenttypes.management import update_contenttypes
    from django.apps import apps as configured_apps
    from django.contrib.auth.management import create_permissions

    for app in configured_apps.get_app_configs():
    update_contenttypes(app, interactive=True, verbosity=0)

    for app in configured_apps.get_app_configs():
    create_permissions(app, verbosity=0)

    这还将为每个模型创建内容类型(它们也是迁移之后创建的),请参阅下文了解为什么您应该关心它。

    也许您在上面的代码中可以比我更有选择性:只更新一些关键应用程序而不是更新所有应用程序。我没有试图有选择性。此外,有可能将两个循环合并为一个循环。我没有用一个循环尝试过。

  3. 您可以通过 codename 搜索获得您的 Permission 对象,但不能保证 codename 是唯一的。两个应用程序可以具有名为 Stuff 的模型,因此您可以拥有与两个不同应用程序关联的 add_stuff 权限。如果发生这种情况,您的代码将失败。你应该做的是通过 codenamecontent_type 进行搜索,保证它们在一起是唯一的。一个唯一的 content_type 与项目中的每个模型相关联:具有相同名称但在不同应用程序中的两个模型将获得两种不同的内容类型。

    这意味着添加对 contenttypes 应用程序的依赖,并使用 ContentType 模型:ContentType = apps.get_model("contenttypes", "ContentType") .

关于python - Django 1.7 数据迁移和用户组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26135523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com