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

时间:2018-09-06 09:13:36

标签: python django field

我试图根据is_staff的值对用户对象的用户名字段进行命名空间。

例如;

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

之所以这样做,是因为可以通过我正在使用的Web应用程序上的活动目录或Oauth2对用户进行授权。由于用户名必须唯一,因此我尝试使用名称空间来避免两个用户与空间用户名发生冲突,但要获得不同来源的授权。

我已经研究过使用 from_db_value get_prep_value 方法,但是这些方法不提供用户对象(因此无法确定is_staff值)。 pre_save 提供对用户模型的访问,但在查询时无济于事 例如.filter(username='Username123', is_staff=True)过滤用户名为staff:Username123的用户

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

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

1 个答案:

答案 0 :(得分:0)

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

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

我会避免将namespace保存在数据库中,因为如果发生更改,则必须保持该值。例如用户不再需要任何人员或名称空间创建中的其他更改。

在您的代码中只需引用user.namespace