0

Django は、django モデルで使用する BigIntegerField を提供するようになりました (svn トランクおよび 1.2 alpha-1 リリースでも利用可能)。

django.contrib.auth.user モデルには、自動インクリメントの主キーとして BigIntegerField が必要ですが、現在は自動インクリメントの IntegerField を主キーとして使用しています。また、contrib.auth.user が ForeginKey として使用される場合は常に、BigIntegerField である必要があります。

これを達成するための最善かつ最も安全な方法は何ですか?

4

2 に答える 2

5

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。これを行うことで、Userwithの参照を更新する必要がなくなりますBigUser

于 2010-01-07T20:22:03.697 に答える