Django 字段 - 如何根据另一个字段的值为字段的 db 值添加前缀?



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

例如;

  • 使用用户名"Username123"和 is_staff=False 保存用户将在数据库中创建一个值为"customer:Username123"的用户对象
  • 使用用户名"Username123"和 is_staff=True 保存用户将在数据库中创建一个值为"staff:Username123"的用户对象

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

我已经研究了使用from_db_valueget_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

最新更新