【问题标题】:What's the proper way to use multiple AUTH_USER_MODEL in Django 1.5?在 Django 1.5 中使用多个 AUTH_USER_MODEL 的正确方法是什么?
【发布时间】:2013-10-15 17:43:22
【问题描述】:

我想为 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'

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

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

【问题讨论】:

  • 为什么扩展用户(customer)与内置用户没有任何关系?
  • 虽然似乎有一些常用字段,如用户名、密码、last_login 等。但有些字段在管理员用户中使用,如组、权限等,但在客户中不使用,反之亦然也是可能的。另一件事是,在 b2c 项目中将客户和管理员保持在具有不同类型值的同一张表中似乎不是一个好主意。

标签: python django django-models django-admin


【解决方案1】:

如果您的要求是将管理员用户和客户分开,我认为拥有多个用户模型没有任何问题。在这一点上,客户模型就像任何模型一样,除了它与用户模型非常相似,如果它适合你,那就太好了。唯一的缺点是您可能必须复制 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

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

【讨论】:

  • 感谢您的回答。正如我在评论部分所说,我想为客户和管理员分开表格。它工作正常,但有一件事让我担心;每次访问者访问页面时都会更改静态设置属性,因此当管理员用户和客户同时访问页面时,由于从不同线程访问相同的属性,我认为他们可能会遇到一些问题。
  • 实际上还有很多情况可以横向发展。我认为解决所有问题的唯一方法是为您的客户制作自己的身份验证和会话后端(这可能最终会很痛苦)。然后,您基本上可以得到两个静态设置 - AUTH_USER_MODELMYAPP_USER_MODEL,它们不会相互干扰。
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2021-05-24
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多