我需要将现有的项目更新为Django 1.5,以利用其新推出的自定义用户模型。但是,我无法将包含带有外键的模型的可重用应用程序迁移到用户。目前,外键指向auth.User
,但使用自定义用户模型时,需要指向myapp.CustomUser
。因此,需要进行某种迁移。我不能简单地为它创建一个迁移文件,因为它是一个可重用的应用程序。它不会成为未来的证据,因为每次更新应用程序时,我都需要记住再次创建迁移(甚至可能存在迁移冲突),因此它不是一个合理的解决方案。
是否有解决此问题的方法,除了可能,分叉每个项目,添加迁移文件,然后使用它?
一些代码:
可重复使用的应用 models.py
from django.conf import settings
from django.db import models
UserModel = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
class ModelA(models.Model):
user = models.ForeignKey(UserModel)
我项目中的 models.py
from django.conf import settings
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
...
我项目中的 settings.py
AUTH_USER_MODEL = 'myapp.CustomUser'
答案 0 :(得分:3)
因此,如果可重用应用程序具有为用户创建外键的迁移,则可以执行以下操作来支持Django 1.5的自定义用户模型。
try:
from django.contrib.auth import get_user_model
except ImportError: # django < 1.5
from django.contrib.auth.models import User
else:
User = get_user_model()
class Migration(SchemaMigration):
def forwards(self, orm):
db.create_table('reusableapp.modela', (
('user', self.gf('django...ForeignKey')(to=orm["%s.%s" % (User._meta.app_label, User._meta.object_name)])
models = {
...
# this should replace "auth.user"
"%s.%s" % (User._meta.app_label, User._meta.module_name): {
'Meta': {'object_name': User.__name__},
}
"reusableapp.modela": {
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['%s.%s']"% (User._meta.app_label, User._meta.object_name)})
}
}
我不确定这是否是最佳解决方案,但它正在django-reversion等应用中使用。
但是,如果您最初使用auth.User
开始然后更改为myapp.customuser
,此解决方案仍然会出现问题,原因只是因为南方尊重AUTH_USER_MODEL,但自定义用户模型的迁移尚未进行创造了。这可能在测试期间发生。南方的1179号门票解决了这个问题(http://south.aeracode.org/ticket/1179)。