我正试图抓住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用户模型 - 使用南方。
非常感谢解决这个问题的任何线索/方向。
答案 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)
]