django - 外键和预定义值的组合作为 Django 模型字段的选择
问题描述
其中一个模型中的ForeignKey
字段存储对另一个模型的引用,其中存储了不同版本的terms and conditions
文档。
class Venue(models.Model):
tc = models.ForeignKey(
'my_app.TC',
on_delete=models.CASCADE,
help_text=_('Version of tc used by this venue')
)
这样,每个人都可以选择适合他们需要Venue
的版本之一。tc
表中的记录TC
经常添加,因此如果给定Venue
想要使用最新版本的文档,则需要手动更新它django admin
。这是一个考虑不周的解决方案,因为数据库中有数十条Venue
记录,它们都有不同的tc
使用方法:
- 一些场地希望
tc
自动更新到最新版本 - 有些人想要/需要
tc
手动提升他们的版本 tc
有些场地根本不使用
需要实现的目标是为每个提供 2 个额外的默认选项Venue
:
1. ---- (blank: venue does not use any `tc`)
2. Latest (venue automatically uses latest version of `tc` available`
以及未指定数量的可用tc
选项(例如TC
模型的外键)
1. v1.0.0
2. v2.1.0
3. ...
在这种情况下Latest
不是与TC
对象的关系。tc
因此,字段 in的选择列表django admin
可能如下所示:
- ---- (blank)
- Latest (literally option is named this was, not latest added `tc` object`)
- v1.0.0
- v2.1.0
- ... (other `tc` objects follow down the list)
Venue
选择选项的方式Latest
将自动使用最新添加的版本TC
(对此的处理超出了此问题的范围)。Venue
选择了某些特定版本的TC
将保留它,直到有人手动更改它。
有没有办法为ForeignKey
字段提供默认值或使用外键作为choices
for中的选项CharField
?
解决方案
您可以尝试创建一个自定义字段,但我认为这太麻烦了。解决此问题的最佳方法是创建两个字段,一个 ForeignKey 和一个简单的标志,用于确定是否获取最新的 tc。然后,您可以定义一个自定义属性来获取正确的 TC。
要允许空白 ForeignKey 字段,只需将null
and设置blank
为 True。
像这样的东西:
class Venue(models.Model):
_tc = models.ForeignKey(
'my_app.TC',
on_delete=models.CASCADE,
help_text=_('Version of tc used by this venue'),
null = True, blank = True
)
use_latest_tc = models.BooleanField(default=False)
@property
def tc(self):
if self.use_latest_tc:
return TC.objects.latest()
return self._tc
根据您更改此值的位置,您可以为您的表单编写自定义 JS,在启用使用 latest 时隐藏 ForeignKeyField。
以下内容未经测试,但可能有效。通过为 tc 创建一个 setter,您也许可以创建一个带有字段 'tc' 和可能值的表单:
@tc.setter
def tc(self, value):
if value == 'latest':
self.use_latest_tc = True
self._tc = True
else:
self.use_latest_tc = False
self._tc = value
推荐阅读
- html - 用于打印的文本放置
- html - 如何更改 CSS 网格中元素的高度
- android - Kotlin - 从字节中检索位位置并将其转换为 int
- python - Python:在“apply_async”中使用外部函数
- sql - 编写 SQL 查询计算卡中的余额
- css - 关键帧动画在其他浏览器中不起作用
- javascript - 点亮元素事件侦听器不会强制重新渲染
- css - CSS:如果空间允许,从垂直切换到水平
- typescript - 字符串枚举作为 TypeScript 中的对象索引类型
- c# - Xamarin.Forms 更改所有 App 中的 Default FontFamily