【问题标题】:Trouble migrating reusable django app models to use a custom user model迁移可重用 django 应用程序模型以使用自定义用户模型时遇到问题
【发布时间】:2013-03-06 13:06:38
【问题描述】:

我需要将 现有 项目更新到 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'

【问题讨论】:

    标签: django django-south database-migration django-1.5


    【解决方案1】:

    因此,如果可重用应用程序有一个为用户创建外键的迁移,则可以执行以下操作来支持 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)。

    【讨论】:

    • 我创建了一个重构南迁移目录的脚本。这里:gist.github.com/benjaoming/5605160
    • 取而代之的是,不能做类似 User = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') ... to=orm[User] ... 'to' :"orm['%s']" % 用户 ?
    • 这个解决方案确实受到了用户的运行时评估和解析的影响。因此,如果您在版本 X 的站点中使用 auth.User,然后在版本 Y 中将其更改为自定义模型,您的部分或全部迁移脚本会立即损坏。
    • 我想解决方案是在 South 中考虑到这一点,以便将适当的冻结用户模型信息添加到迁移信息中,而不是依赖于基于当前设置。同时,这适用于无需从 auth.User 更改为自定义用户(或从自定义用户更改为另一个自定义用户,甚至返回 auth.User)的任何站点。
    猜你喜欢
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多