PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Мигриране на съществуващи данни за auth.User към нов потребителски модел на Django 1.5?

Юг е повече от способен да направи тази миграция вместо вас, но трябва да сте умни и да го правите на етапи. Ето ръководството стъпка по стъпка:(Това ръководство предполагаше, че имате подклас 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. Създайте своя персонализиран User модел в accounts приложение, но се уверете, че е дефинирано като:

    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.
    

Честно казано, ако вече имате добри познания за настройката си и вече използвате юг, трябва да е толкова просто, колкото да добавите следната миграция към модула на вашите акаунти.

# 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 автоматично ще се актуализира, за да сочи правилната таблица поради ограничения на db, но имената на таблиците на M2M полета се генерират от имената на двете крайни таблици и ще се нуждаят от ръчно актуализиране по този начин.

РЕДАКТИРАНЕ 2:Благодаря на @Tuttle &@pix0r за корекциите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задействане на Postgres след вмъкване при достъп до НОВО

  2. Вграден PostgreSQL за Java JUnit тестове

  3. Събирайте рекурсивни JSON ключове в Postgres

  4. Postgres UUID JDBC не работи

  5. Как да свържете GraphQL и PostgreSQL