django south - 使用AbstractUser时的旧用户模型

时间:2013-11-14 15:49:16

标签: django django-south

我正试图抓住django和南方,我似乎遇到了stale contenttype问题 - 我无法在SO或google上找到它的修复。

所以,首先,我在django == 1.6上有一个简单的项目,其中包含以下已安装的应用程序:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django_browserid',  # Load after auth
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sitemaps',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'south',
)

AUTH_USER_MODEL = 'auth.User'

我在此运行syncdb并且在此阶段不创建超级用户。

现在,我创建了一个新应用loginapp并创建了AbstractUser,如下所示:

#loginapp/models.py
class MyUser(AbstractUser):
    is_admin_enabled = models.BooleanField(default=True) # new field

并在settings.py上更改以下内容:

AUTH_USER_MODEL = "loginapp.MyUser"

现在,在登录应用中,我运行(我将loginapp添加到我的INSTALLED_APPS词典中:

python manage.py schemamigration loginapp --initial && python manage.py migrate loginapp

..到目前为止一切都很好 - 我可以看到南方在我的数据库上创建了新的用户模型。

现在,我回去为我的项目做一个syncdb,然后我得到:

The following content types are stale and need to be deleted:

    auth | user

Any objects related to these content types by a foreign key will also
be deleted. Are you sure you want to delete these content types?
If you're unsure, answer 'no'.

..我猜django意识到用户模型已经改变,默认模型现在已经过时了。我尝试在这里使用“是”,我看到数据库表仍然存在 - 大概是因为syncdb不会删除数据库表。

我如何首先避免上述问题?我只需要使用我的loginapp中定义的用户模型而不是我的数据库中的默认django用户模型 - 使用南方。

非常感谢解决这个问题的任何线索/方向。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,使用Django 1.7迁移将auth.models.User迁移到myapp.User(继承自AbstractUser),并且不想擦除我现有的生产管理员记录与User有关的表条目,所以我坚持要求完全正确。

假设myappp.models是:

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    class Meta:
        db_table = 'auth_user'

以下是我提出的建议:

from django.db import models, migrations
import django.utils.timezone
import django.core.validators

MYAPP = 'myapp'

def migrate_func(old, new, apps, schema_editor):
    ContentType = apps.get_model("contenttypes", "ContentType")
    db_alias = schema_editor.connection.alias
    ct = ContentType.objects.using(db_alias).get(app_label=old, model='user')
    ct.app_label = new
    ct.save()

def forwards_func(apps, schema_editor):
    migrate_func('auth', MYAPP, apps, schema_editor)

def backwards_func(apps, schema_editor):
    migrate_func(MYAPP, 'auth', apps, schema_editor)


class Migration(migrations.Migration):

    dependencies = [
        ...
    ]

    database_operations = [
        migrations.RunPython(forwards_func, backwards_func)
    ]

    state_operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                ...
            ],
            options={
                'db_table': 'auth_user',
            },
            bases=(models.Model,),
        ),
    ]

    operations = [
        migrations.SeparateDatabaseAndState(
            state_operations=state_operations),
        migrations.SeparateDatabaseAndState(
            database_operations=database_operations)
    ]