Django - 允许重复用户名
我正在做一个django项目,需要把用户分成不同的组,每个组都有自己的username
命名空间。
举个例子,我可能会有多个“组织”,而username
在每个组织内只需要是唯一的。
我知道可以通过使用另一个模型来实现,这个模型包含了用户名和组织ID,但这样一来,默认的django认证User
模型上还是会有一个没用的(而且是必填的)字段,我得想办法填上这个字段。
我已经写了自己的认证后端,可以通过LDAP来验证用户。不过,正如我之前提到的,我还是面临着如何处理默认django用户的username
字段的问题,不知道该怎么填或者忽略它。
有没有办法去掉django认证用户的username
字段的唯一性限制呢?
5 个回答
我个人没有遇到过需要解决这个问题的情况,但从软件即服务(SAAS)的角度来看,有一种方法可以处理这个问题,那就是在用户名前面加上一个组织的标识符(假设每个组织都是独一无二的)。举个例子:subdomain.yoursite.com 这个地址就可以对应一个用户名:subdomain_username。你只需要在登录到子域名的时候,写一些代码逻辑,把这个标识加到用户名上就可以了。
你可以做的是扩展用户模型。对于用户表,生成一个用户名(比如 A_123, A_345),这个用户名在网站上是完全不显示的。
接着,创建一个新的模型,基于用户模型进行扩展。
class AppUser(User):
username = models.CharField...
organization = models.CharField...
然后,你需要创建一个自定义的认证后端,使用 AppUser 代替用户对象。
我不太确定这是不是你想要的,但我觉得你可以用一种类似于这个回答的方法来解决。
下面的代码是可以用的,只要它放在Django加载你的模型时会执行的地方。
from django.contrib.auth.models import User
User._meta.get_field('username')._unique = False
需要注意的是,如果auth_user
表已经创建,这个方法不会改变数据库中的唯一约束。因此,你需要在运行syncdb之前先做这个修改。或者,如果你不想重新创建auth_user
表,你可以先做这个修改,然后手动修改数据库表来去掉约束。