在Django 1.5中使用多个AUTH_USER_MODEL的正确方法是什么?

bur*_*mre 5 python django django-models django-admin

我想为django.contrib.auth模块使用两个不同的模型.第一个是Django提供的默认用户模型,它完全适合管理员访问(组,权限等),但另一个是客户模型,它具有许多不同的属性(城市,区域设置,地址等).默认用户模型.这些用户组必须使用不同的表,并且不得有任何关系.

我创建了一个继承自AbstractBaseUser的Customer模型和一个名为ChangeBaseUser的中间件类,如下所示:

class ChangeBaseUser(object):
    def process_request(self, request):  
        match = resolve(request.path)
        if match.app_name == "myapp":
            settings.AUTH_USER_MODEL = 'myapp.Customer'
        else:
            settings.AUTH_USER_MODEL = 'auth.User'
Run Code Online (Sandbox Code Playgroud)

它工作但我不确定这是否是正确的方法,因为在文档中有一个部分(链接)暗示方便的方法是为默认用户模型分配静态值.

如果这不是正确的方法,您对每个模块有多个用户模型有什么建议吗?

mik*_*725 2

如果您的要求是将管理员用户和客户分开,那么我认为拥有多个用户模型没有任何问题。此时,客户模型就像任何模型一样,只是它与用户模型非常相似,如果它适合您,那就完全没问题。唯一的缺点是您可能必须复制 django 为 Django 用户模型提供的许多帮助程序,例如用户的身份验证后端或会话。如果你愿意做这一切,这似乎完全没问题。

然而,如果您希望使用许多 django 助手,您可能需要创建一个非常基本的用户模型,它将作为管理员和客户的基础:

class User(AbstractBaseUser):
    # use this for auth and sessions

class Admin(models.Model):
    user = models.OneToOneField(UserBase, related_name='admins')
    # ... other admin-specific fields

class Customer(models.Model):
    user = models.OneToOneField(UserBase, related_name='admins')
    # ... other customer-specific fields
Run Code Online (Sandbox Code Playgroud)

这将允许您重用 Django 提供的许多开箱即用的东西,但是它会产生一些额外的数据库开销,因为必须计算更多的连接。但随后您可以为客户缓存内容,这样您就可以获得一些性能恢复。

  • 实际上还有很多情况可能会出现问题。我认为解决所有问题的唯一方法是为您的客户创建自己的身份验证和会话后端(这可能最终会很痛苦)。然后你基本上可以得到两个静态设置——“AUTH_USER_MODEL”和“MYAPP_USER_MODEL”,它们不会互相干扰。 (2认同)