User に BigIntegerField が必要な理由はわかりませんが (たくさんのユーザーが必要です)、実装は非常に簡単です。まず、 Southのようなデータベース移行システムを入手する必要があります。これを使用して、現在のデータのいくつかの移行を行います。データベースに何もない場合は、この部分を無視して最後までスキップしてください。
次のように、contrib.auth バージョンから継承するカスタム ユーザー クラスを作成することから始めます。
from django.contrib.auth.models import User, UserManager
from django.db import models
class BigUser(User):
id = models.BigIntegerField(pk = True)
objects = UserManager()
#this lets you transperantly use any
#query methods that you could on User
次に、South のデータ移行機能を使用して、すべてのユーザーのコピーをUser.objects.all()
新しいBigUser
モデルに作成します。
次に、各モデルの必要な場所に外部キーを追加します。 元の FK はまだ削除しないでください。そうしないと、リンクが失われます。新しいキーを追加した後、別のスキーマ移行を行います。
次に、FK を古い User モデルから新しい BigUser モデルにコピーする別のデータ移行を行います。そのデータを移行します。
次に、古い FK を User モデルに削除しても安全です。
コードの残りの部分を BigUser の新しいフィールド名を使用するように変更したくない場合は、South rename-field ユーティリティを使用できます (South はフィールドの名前変更を自動検出できないため、必ずドキュメントを読んでください)。
データベースにデータがない場合は、上記のクラスを実装して現在のモデルにドロップするだけです。
データ移行の記述に助けが必要な場合は、モデルを 1 つか 2 つ投稿する必要があります。
「ドロップイン」の代替品がUser
必要なので、さらに 2 つの手順が必要です。まず、カスタム認証バックエンドを作成する必要があります。これにより、すべての認証要求が新しいモデルに送信され、request.user
返さBigUser
れずに返されることが保証されます。 User
. このスニペットをコピーして、settings.py と同じディレクトリにある auth_backend.py というファイルに貼り付けます。
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
class CustomUserModelBackend(ModelBackend):
def authenticate(self, username=None, password=None):
try:
user = self.user_class.objects.get(username=username)
if user.check_password(password):
return user
except self.user_class.DoesNotExist:
return None
def get_user(self, user_id):
try:
return self.user_class.objects.get(pk=user_id)
except self.user_class.DoesNotExist:
return None
@property
def user_class(self):
if not hasattr(self, '_user_class'):
self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.', 2))
if not self._user_class:
raise ImproperlyConfigured('Could not get custom user model')
return self._user_class
次に、settings.py ファイルで、このバックエンドを追加し、カスタム ユーザー モデル設定を設定する必要があります。次のようにします。
AUTHENTICATION_BACKENDS = (
'auth_backends.CustomUserModelBackend',
)
...
CUSTOM_USER_MODEL = 'your-app-name.BigUser'
このコードの最後のセクションは、User モデルのサブクラス化について説明している別のWeb サイトからのものです。
コードの残りの部分に「ドロップイン」するために必要なことは、すべてを に置き換えることだけfrom django.contrib.auth.models import User
ですfrom your-app-name import BigUser as User
。これを行うことで、User
withの参照を更新する必要がなくなりますBigUser