0

我正在尝试掌握 django 和 South,但我似乎遇到了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'

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

现在,我创建一个新应用程序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 用户模型 - 使用南。

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

4

1 回答 1

0

auth.models.User我在使用 Django 1.7 迁移迁移到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)
    ]
于 2014-12-28T00:30:09.857 回答