在迁移中访问django-custom-user manager方法

时间:2015-03-01 00:52:57

标签: python django django-custom-user

我想在django 1.7项目的数据迁移中播放超级用户记录。我正在使用django-custom-user应用。我的迁移看起来像这样:

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

def load_data(apps, schema_editor):
    EmailUser = apps.get_model('custom_user', 'EmailUser')
    root = EmailUser.objects.create_superuser(email='admin@somesite.com', password='supersecure')


class Migration(migrations.Migration):
    dependencies = [
        ('accounts', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(load_data)
    ]

运行./manage.py migrate时出现以下错误:

Running migrations:
  Applying accounts.0002_initial_data...Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 161, in handle
    executor.migrate(targets, plan, fake=options.get("fake", False))
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 68, in migrate
    self.apply_migration(migration, fake=fake)
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 102, in apply_migration
    migration.apply(project_state, schema_editor)
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/migration.py", line 105, in apply
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
  File "/usr/local/lib/python2.7/site-packages/django/db/migrations/operations/special.py", line 117, in database_forwards
    self.code(from_state.render(), schema_editor)
  File "/Users/spoolphiz/work/somesite/accounts/migrations/0002_initial_data.py", line 14, in load_data
    root = EmailUser.objects.create_superuser(email='admin@somesite.com', password='f00b@r')
AttributeError: 'Manager' object has no attribute 'create_superuser'

我看到EmailUserManager does have a create_superuser method。我错误地调用了经理的职能吗?

编辑:

我看到了same issue here。复制所有代码真的是最好的解决方案吗?似乎在那时我最好使用RunSQL并手动执行插入。

2 个答案:

答案 0 :(得分:1)

我在1.8.4中看到与@cpury相同的问题。我在我的管理器中设置了use_in_migrations = True,但出乎意料的是,使用Model.objects.my_custom_method()进行数据迁移时,自定义管理器方法不可用,给出了相同的错误。我做的解决方法是导入管理器并实例化它。然后问题是self.model是None,因为它没有连接到模型。所以我做了以下操作,它似乎有效,虽然我不明白为什么use_in_migrations标志不像我预期的那样工作。

from appname.managers import MyManager
def add_data(apps, schema_editor):
    mgr = MyManager()
    mgr.model = apps.get_model('appname', 'Model')
    mgr.my_method_that_adds_data()

编辑:看起来AlterModelManagers操作设置模型的自定义管理器尚未创建,并且它在稍后的迁移中出现。我可能已经忘记了运行&#39; makemigrations&#39;之前&#39; makemigrations --empty&#39;。我在RunPython调用add_data()之前移动了这个操作,但仍然得到了AttributeError。

答案 1 :(得分:0)

不幸的是,经理weren't serialized before Django 1.8因此您AttributeError来到这里。

我建议您升级到Django==1.8b1并运行makemigration以序列化您的自定义用户管理器。否则,您需要使用您的vanilla经理的create方法来模仿UserManager.create_superuser所做的事情。