10

我想以编程方式在 django 中创建组,但不是在视图中,而是在模型中(例如使用迁移)。怎么做?谷歌和文档中没有关于它的信息(至少这里没有:https ://docs.djangoproject.com/en/1.7/topics/auth/default/#groups )

4

2 回答 2

12

好的,看来您正在使用 Django 1.7 的新迁移系统。这与 South 相似但不完全相同。

涉及更改表中数据的迁移是数据迁移,您通常需要编写 Python 代码来进行迁移。

从 Django 文档,有这个例子:

# -*- coding: utf-8 -*-
from django.db import models, migrations

def combine_names(apps, schema_editor):
    # We can't import the Person model directly as it may be a newer
    # version than this migration expects. We use the historical version.
    Person = apps.get_model("yourappname", "Person")
    for person in Person.objects.all():
        person.name = "%s %s" % (person.first_name, person.last_name)
        person.save()

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(combine_names),
    ]

请注意,迁移期间要运行的代码位于combine_names函数中,由迁移列表中的migrations.RunPython(combine_names)条目调用。operations您的迁移应该在这样的函数中创建其组,以及需要的任何其他数据迁移。

您可能应该使用类似的行

Group = apps.get_model("auth", "Group")
my_group, created = Group.objects.get_or_create(name='group1')

创建您的组,以防表中已经存在该名称的组。

不要在迁移到 Python 文件的根级别期间运行代码;如果这样做,它将在每次导入迁移时运行,例如,每次运行./manage.py runserver.

PS您需要将您的migrations.RunPython条目放在operations列表中的正确位置;例如,如果将它放在删除它需要的表的操作之后,它将不起作用。

于 2014-08-03T15:10:23.963 回答
6

组就像任何其他 Django 模型一样。您可以像创建其他任何东西一样创建它们。

my_group = Group.objects.create(name='group1')
于 2014-08-03T14:46:20.293 回答