我正在尝试根据is_staff
的值为用户对象的用户名字段命名命名空间。
例如;
- 使用用户名"Username123"和 is_staff=False 保存用户将在数据库中创建一个值为"customer:Username123"的用户对象
- 使用用户名"Username123"和 is_staff=True 保存用户将在数据库中创建一个值为"staff:Username123"的用户对象
这样做的原因是,用户可以通过我正在处理的Web应用程序上的Active directory或Oauth2获得授权。由于用户名需要是唯一的,我正在尝试使用名称间距来避免两个用户与空间用户名发生冲突,但授权来自不同来源。
我已经研究了使用from_db_value和get_prep_value方法,但这些方法不提供用户对象(因此,无法确定is_staff值(。pre_save提供对用户模型的访问,但在查询时没有帮助 例如.filter(username='Username123', is_staff=True)
过滤具有用户名的用户staff:Username123
我也尝试使用户名字段不唯一,但决定这是一个坏主意,因为 django 警告不要这样做。
有没有人对如何保存和查询取决于is_staff
标志的前缀值有任何建议?
在模型中创建一个属性,该属性根据is_staff
值呈现所需的值:
@property
def namespace(self):
return '%s:%s' % ('staff' if is self.is_staff else 'customer', self.username)
我会避免将namespace
保存在数据库中,因为如果发生更改,您必须维护该值。 例如,用户在创建命名空间时不再有任何员工或其他更改。
在您的代码中,只需参考user.namespace