Django,BigIntegerField和django.contrib.auth.user.id

gbs*_*ith 0 django biginteger django-contrib

Django现在提供了一个在Django模型中使用的BigIntegerField(可在svn trunk和1.2 alpha-1版本中使用)。

我需要django.contrib.auth.user模型具有一个BigIntegerField作为其自动递增主键,而当前它使用一个自动递增的IntegerField作为其主键。另外,无论在哪里contrib.auth.user用作ForeginKey,也都必须是BigIntegerField。

实现此目标的最佳和最安全的方法是什么?

Jud*_*ill 5

虽然我不确定为什么您需要在User上使用BigIntegerField(您必须拥有整个lotta用户),但是它很容易实现。首先,您需要获得像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
Run Code Online (Sandbox Code Playgroud)

然后使用South的数据迁移功能将所有人复制User.objects.all()到新BigUser模型中。

然后在需要的地方通过每个模型添加一个foriegnkey。 请勿删除原始FK,否则您的链接将会丢失。添加新密钥后,进行另一种模式迁移。

然后进行另一次数据迁移,将FK从旧的User模型复制到新的BigUser模型。迁移该数据。

然后可以安全地删除旧的FK到用户模型。

如果要避免更改其余代码,以对BigUser使用新的字段名称,则可以使用South重命名字段实用程序(South无法自动检测字段重命名,因此请确保阅读文档)。

如果数据库中没有任何数据,则只需实现上述类并将其放入当前模型即可。

如果您在编写数据迁移方面需要帮助,则必须发布一个或两个模型。

由于您需要的是“嵌入式”替代品,因此User还需要两个步骤:首先,我们需要创建一个自定义身份验证后端,这可以确保所有身份验证请求都发送到您的新模型,并且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
Run Code Online (Sandbox Code Playgroud)

然后,在您的settings.py文件中,您需要添加此后端并设置自定义用户模型设置...,如下所示:

AUTHENTICATION_BACKENDS = (
    'auth_backends.CustomUserModelBackend',
)
...

CUSTOM_USER_MODEL = 'your-app-name.BigUser'
Run Code Online (Sandbox Code Playgroud)

代码的最后一部分来自另一个网站,该网站描述了User模型的子类。

现在,您需要做的“插入”其余代码的全部工作就是from django.contrib.auth.models import User用替换所有的代码from your-app-name import BigUser as User。通过这样做,你不会有更新的任何引用UserBigUser