python - Django Fields - 如何根据另一个字段的值为字段的数据库值添加前缀?
问题描述
我正在尝试根据 的值命名用户对象的用户名字段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
标志的前缀值有任何建议?
解决方案
在模型中创建一个属性,根据值呈现您需要的is_staff
值:
@property
def namespace(self):
return '%s:%s' % ('staff' if is self.is_staff else 'customer', self.username)
我会避免将其保存namespace
在数据库中,因为如果发生变化,您必须维护该值。例如,用户不再是工作人员或其他更改命名空间的创建。
在您的代码中,只需参考user.namespace
推荐阅读
- android - Android 12 - Obsufaction 导致动画模糊
- c - c语言设置gtk的问题
- scala - 在 intellij IDE 中遇到 sparksession 错误 - 原因:java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession - sbt with scala
- ios - Xamarin ios webview:发送自定义导航事件
- javascript - 基于多个逗号分隔值过滤表数据
- sql - 如果使用 try catch 块,我可以删除开始结束语句吗
- javascript - 在Node JS中返回响应后停止执行代码?
- javascript - 密码状态迟到了一个字符的反应
- javascript - 使用 JavaScript 显示用户图像以使用 html2canvas 从 blob 转换为图像进行保存
- github - 过滤用户关闭的 Github 问题