虽然我不确定为什么您需要在 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 从旧用户模型复制到新的 BigUser 模型。迁移该数据。
然后可以安全地将旧 FK 删除到 User 模型。
如果您想避免更改其余代码以使用 BigUser 的新字段名称,您可以使用 South rename-field 实用程序(South 无法自动检测字段重命名,因此请务必阅读文档)。
如果您在数据库中没有任何数据,那么您可以简单地实现上面的类并将其放入您当前的模型中。
如果您在编写数据迁移时需要帮助,您必须发布一两个模型。
由于您需要“直接”替代User,因此您还需要两个步骤:
首先,我们需要创建一个自定义身份验证后端,以确保任何身份验证请求都发送到您的新模型,并且request.user 返回BigUser 而不是User。只需将此 sn-p 剪切并粘贴到与 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'
最后一段代码来自另一个website,描述了用户模型的子类化。
现在,在其余代码中“插入”所需要做的就是将所有 from django.contrib.auth.models import User 替换为 from your-app-name import BigUser as User。通过这样做,您不必用BigUser 更新任何User 的引用