1

我有一个现有的 django-cms 版本。3.1.3 项目,我想用django-custom-user中的模型替换默认的 django User 模型(将电子邮件作为我的用户的用户名)。我已将该custom_user应用程序添加到我的INSTALLED_APPS和设置AUTH_USER_MODEL = 'custom_user.EmailUser'中。最后我应用了迁移。

在我的自定义模型中,一切似乎都运行良好,但是引用auth_user表(GlobalPagePermissionPagePermission, PageUser)的 django-cms 模型UserSettings没有更新为具有对新自定义用户表的外键引用。

django-cms 文档说通常建议在项目开始时添加自定义用户模型,但是我在这里,在项目中间,非常希望避免删除我的 cms 模型(带有数据) 使其工作。

如果我在一个项目的开始,并且在迁移 django-cms 模型之前添加了自定义用户模型,那么 django-cms 模型实际上会获得对自定义用户模型表的引用而不是默认的引用吗?

我有什么方法可以为 django-cms 模型进行迁移,所以他们使用新的自定义用户模型而不是默认用户模型?

更新

我试图实现 yakky 的建议:

from __future__ import unicode_literals
from django.conf import settings
from django.db import models, migrations
import django.db.models.deletion
from django.utils.translation import ugettext_lazy as _

def up(apps, schema_editor):
    PageUser = apps.get_model("cms", "PageUser")
    db_alias = schema_editor.connection.alias
    for pu in PageUser.objects.all():
        pu['emailuser_ptr_id'] = pu['user_ptr_id']
        pu.save()

def down(apps, schema_editor):
    PageUser = apps.get_model("cms", "PageUser")
    db_alias = schema_editor.connection.alias
    for pu in PageUser.objects.all():
        pu['user_ptr_id'] = pu['emailuser_ptr_id']
        pu.save()

class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        (‘myapp’, ‘previous-migration’),
    ]

    operations = [

        migrations.RenameField(
            model_name='PageUser',
            old_name='user_ptr_id',
            new_name='user_ptr_id_old',
        ),

        migrations.AddField(
            model_name='PageUser',
            name='emailuser_ptr_id',
            field=models.ForeignKey(null=True, to=settings.AUTH_USER_MODEL, verbose_name=_('user'), blank=True),
            preserve_default=True,
        ),

        migrations.RunPython(up, down),

        migrations.RemoveField(
            model_name='PageUser',
            name='user_ptr_id_old',
        ),
    ]

它未能KeyError: ('myapp', u'pageuser')建议它PageUser在我的自定义应用程序而不是 cms 应用程序中查找模型。如何将这些迁移应用到 cms 模型?

4

2 回答 2

3

据说在项目生命周期的中间替换 Django 用户模型是不可取的(请参阅https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#substituting-a-custom-user-model ) 因为 Django 在创建关系后不提供任何修改关系的方法,要替换自定义用户模型,您可以编写自定义迁移,更改 django CMS 模型中的外键以指向并创建新的用户模型。

就像是:

...
migrations.RenameField(
    model_name='globalpagepermission',
    old_name='user',
    new_name='user_old',
),
migrations.AddField(
    model_name='globalpagepermission',
    name='user',
    field=models.ForeignKey(null=True, to=settings.AUTH_USER_MODEL, verbose_name=_('user'), blank=True),
    preserve_default=True,
),
migrations.RunPython(copy_data),
migrations.RemoveField(
    model_name='globalpagepermission',
    name='user_old',
),
...

对任何相关模型/字段重复。

copy_data方法会将外键的值从复制user_olduser

代码完全未经测试,但总体思路应该可行。

或者,您可以编写一个 RunSQL 迁移来获得相同的结果。

具有相同主键的用户也必须存在,新模型才能正常工作。

于 2016-01-18T22:15:29.607 回答
1
于 2016-01-24T11:31:32.860 回答