我想为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)暗示方便的方法是为默认用户模型分配静态值。
如果这不是正确的方法,您对每个模块有多个用户模型有什么建议吗?
答案 0 :(得分:2)
如果您的要求是让管理员用户和客户分开,我认为拥有多个用户模型没有任何问题。此时,客户模型就像任何模型一样,除非它与用户模型非常相似,如果适合您,则完全没问题。唯一的缺点是你必须复制许多帮助器django为你提供Django用户模型,例如auth后端或用户会话。如果你愿意做这一切,这似乎完全没问题。
如果您希望使用许多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提供的许多开箱即用的东西,但是它会产生一些额外的数据库开销,因为必须计算更多的连接。但是,您可以为客户缓存内容,这样您就可以获得一些性能。