首页 > 解决方案 > Django Fields - 如何根据另一个字段的值为字段的数据库值添加前缀?

问题描述

我正在尝试根据 的值命名用户对象的用户名字段is_staff

例如;

这样做的原因是用户可以通过我正在处理的 Web 应用程序上的活动目录或 Oauth2 进行授权。由于用户名需要是唯一的,我试图使用名称间距来避免两个用户与空间用户名发生冲突,但来自不同来源的授权。

我已经研究过使用from_db_valueget_prep_value方法,但它们不提供用户对象(因此,无法确定 is_staff 值)。pre_save提供对用户模型的访问,但在查询时没有帮助,例如.filter(username='Username123', is_staff=True)过滤用户名的用户staff:Username123

我也尝试过使用户名字段不唯一,但认为这是一个坏主意,因为 django 对此提出警告。

有没有人对如何保存和查询取决于is_staff标志的前缀值有任何建议?

标签: pythondjangofield

解决方案


在模型中创建一个属性,根据值呈现您需要的is_staff值:

@property
def namespace(self):
   return '%s:%s' % ('staff' if is self.is_staff else 'customer', self.username)

我会避免将其保存namespace在数据库中,因为如果发生变化,您必须维护该值。例如,用户不再是工作人员或其他更改命名空间的创建。

在您的代码中,只需参考user.namespace


推荐阅读