gpt4 book ai didi

django - 将现有的 auth.User 数据迁移到新的 Django 1.5 自定义用户模型?

转载 作者:行者123 更新时间:2023-11-29 11:07:01 26 4
gpt4 key购买 nike

我不想破坏我网站上的所有用户。但我想利用 Django 1.5 的自定义可插入用户模型。这是我的新用户模型:

class SiteUser(AbstractUser):
site = models.ForeignKey(Site, null=True)

一切都适用于新安装的新模型(我有其他代码,以及这样做的充分理由——所有这些都与这里无关)。但是,如果我将它放在我的实时站点上并同步并迁移,我将失去所有用户,或者至少他们将位于与为我的新模型创建的新表不同的孤立表中。

我熟悉南方,但基于 this post和我的一些试验,它的数据迁移目前似乎不适合这个特定的迁移。因此,我正在寻找某种方法来让 South 为这个工作或为我可以在我的每个服务器 (Postgres 9.2) 上运行的一些非 South 迁移(原始 SQL、dumpdata/loaddata 或其他)迁移用户一旦创建了新表,而旧的 auth.User 表仍在数据库中。

最佳答案

South 完全能够为您完成此迁移,但您需要聪明并分阶段进行。这是分步指南:(本指南假定您是 AbstractUser 的子类,而不是 AbstractBaseUser)

  1. 在进行切换之前,请确保在应用程序中启用了南向支持包含您的自定义用户模型(为了本指南,我们将其称为 accounts 和模型 User)。此时您应该还没有自定义用户模型。

    $ ./manage.py schemamigration accounts --initial
    Creating migrations directory at 'accounts/migrations'...
    Creating __init__.py in 'accounts/migrations'...
    Created 0001_initial.py.

    $ ./manage.py migrate accounts [--fake if you've already syncdb'd this app]
    Running migrations for accounts:
    - Migrating forwards to 0001_initial.
    > accounts:0001_initial
    - Loading initial data for accounts.
  2. 在帐户应用中创建一个新的空白用户迁移。

    $ ./manage.py schemamigration accounts --empty switch_to_custom_user
    Created 0002_switch_to_custom_user.py.
  3. accounts 应用程序中创建您的自定义 User 模型,但确保它被定义为:

    class SiteUser(AbstractUser): pass
  4. 用以下代码填写空白迁移。

    # encoding: utf-8
    from south.db import db
    from south.v2 import SchemaMigration

    class Migration(SchemaMigration):

    def forwards(self, orm):
    # Fill in the destination name with the table name of your model
    db.rename_table('auth_user', 'accounts_user')
    db.rename_table('auth_user_groups', 'accounts_user_groups')
    db.rename_table('auth_user_user_permissions', 'accounts_user_user_permissions')

    def backwards(self, orm):
    db.rename_table('accounts_user', 'auth_user')
    db.rename_table('accounts_user_groups', 'auth_user_groups')
    db.rename_table('accounts_user_user_permissions', 'auth_user_user_permissions')

    models = { ....... } # Leave this alone
  5. 运行迁移

    $ ./manage.py migrate accounts
    - Migrating forwards to 0002_switch_to_custom_user.
    > accounts:0002_switch_to_custom_user
    - Loading initial data for accounts.
  6. 立即对您的用户模型进行任何更改。

    # settings.py
    AUTH_USER_MODEL = 'accounts.User'

    # accounts/models.py
    class SiteUser(AbstractUser):
    site = models.ForeignKey(Site, null=True)
  7. 为此更改创建并运行迁移

    $ ./manage.py schemamigration accounts --auto
    + Added field site on accounts.User
    Created 0003_auto__add_field_user_site.py.

    $ ./manage.py migrate accounts
    - Migrating forwards to 0003_auto__add_field_user_site.
    > accounts:0003_auto__add_field_user_site
    - Loading initial data for accounts.

老实说,如果您已经非常了解您的设置并且已经在使用 south,那么它应该就像将以下迁移添加到您的帐户模块一样简单。

# encoding: utf-8
from south.db import db
from south.v2 import SchemaMigration
from django.db import models

class Migration(SchemaMigration):

def forwards(self, orm):
# Fill in the destination name with the table name of your model
db.rename_table('auth_user', 'accounts_user')
db.rename_table('auth_user_groups', 'accounts_user_groups')
db.rename_table('auth_user_permissions', 'accounts_user_permissions')
# == YOUR CUSTOM COLUMNS ==
db.add_column('accounts_user', 'site_id',
models.ForeignKey(orm['sites.Site'], null=True, blank=False)))

def backwards(self, orm):
db.rename_table('accounts_user', 'auth_user')
db.rename_table('accounts_user_groups', 'auth_user_groups')
db.rename_table('accounts_user_user_permissions', 'auth_user_user_permissions')
# == YOUR CUSTOM COLUMNS ==
db.remove_column('accounts_user', 'site_id')

models = { ....... } # Leave this alone

编辑 2/5/13:为 auth_user_group 表添加了重命名。由于数据库约束,FK 将自动更新以指向正确的表,但 M2M 字段的表名是从 2 个端表的名称生成的,需要以这种方式手动更新。

编辑 2:感谢@Tuttle 和@pix0r 的更正。

关于django - 将现有的 auth.User 数据迁移到新的 Django 1.5 自定义用户模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com