2014-08-03 3 views
10

Я хочу создавать группы в django программно, но не в виде, а скорее в какой-то модели (например, используя миграции). Как это сделать? В google и документах нет информации (по крайней мере, здесь: https://docs.djangoproject.com/en/1.7/topics/auth/default/#groups)Создавать группы django программно

+0

Хорошо, вам нужно уточнить, что вы подразумеваете под «миграциями». И я действительно очень надеюсь, что вы имеете в виду, что вы используете [Юг] (http://south.aeracode.org/), и вы пишете [миграцию данных] (http://south.readthedocs.org/en /latest/tutorial/part3.html#data-migrations). –

ответ

11

Хорошо, похоже, вы используете новую систему миграции Django 1.7. Это похоже на то, что не похоже на Юг.

Перенос, связанный с изменением данных в таблицах, представляет собой data migration, и вам обычно нужно написать код 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.

P.S. Вам нужно поместить свою запись migrations.RunPython в нужную точку в списке operations; он не будет работать, если вы поместите его после операции, которая удалит нужную таблицу, например.

+0

Я принимаю этот ответ, потому что он более расширен и из-за напоминания мне проверить, нет ли уже определенной группы, спасибо – b174662

5

Группы, как и любая другая модель Django. Вы можете создать их так, как если бы вы что-нибудь еще.

my_group = Group.objects.create(name='group1') 
+0

Я знаю это ... Но этот код работает только на виду, не так ли? Если я ошибаюсь, расскажите, где я должен это поставить. – b174662

+0

Я не понимаю ваш вопрос. Вы можете запустить этот код в любом месте: в миграции, в оболочке, в пользовательской команде управления ... –

+0

Я хочу выполнить это только один раз (например, модели создаются один раз). Когда я запрашиваю его при переносе, он запускается каждый раз при запуске сервера. – b174662