4

新しく利用可能になったカスタム ユーザー モデルを利用するには、既存のプロジェクトを 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'
4

1 に答える 1

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 )。

于 2013-03-20T01:14:26.450 に答える