gpt4 book ai didi

python - 如何将外键选择限制为同一模型中的另一个外键

转载 作者:行者123 更新时间:2023-11-28 21:58:56 25 4
gpt4 key购买 nike

我正在制作一个 Django 应用程序,但我遇到了一个问题。我正在尝试定义一个模型,其中一个 ForeignKey 将依赖于另一个 ForeignKey

描述部分

我的申请是关于做出选择的。

假设您要做出一个决定,一个决定有多个选择,还有一个选择 有一个 status(因为其他限制)。

一个status可以用于多个choices,但是一个status只能与一个decision相关,与 choice 链接的相同。

数据库模式

它不是固定的,如果需要可能会更改:

,____________,                  ,____________,
| | 1, n 1, 1 | |
| Decision |------------------| Status |
|____________| |____________|
| |
| 1, n | 1, n
| |
| 1, 1 |
,_____|______, |
| | 1, 1 |
| Choice |-------------------------'
|____________|

代码

这是我当前的(简化的)(不工作)代码:

class Decision (models.Model):
name = models.CharField (max_length = 63)

class Status (models.Model):
value = models.CharField (max_length = 63)
decision = models.ForeignKey (Decision)

class Choice (models.Model):
name = models.CharField (max_length = 63)

decision = models.ForeignKey (Decision)
status = models.ForeignKey (Status, limit_choices_to = {'decision' : decision})

此处的重要部分是 limit_choices_to = {'decision' : decision}

额外信息

我发现另一个 SO 问题 ( In django, how to limit choices of a foreignfield based on another field in the same model? ) 处理相同的问题,但这个问题已经过时了,最好的答案是依赖外部应用程序 ( django-smart-selects )。

我宁愿不必使用外部的东西,我不明白为什么像 3 表关系这样简单的东西不能只使用 Django 来解决!

如果有人有任何解决方案或建议,请告诉我。

最佳答案

您所要求的是不可能的,至少不在您设置的范围内(没有表格,没有外部库)。 Choice 模型的 status 字段是一个外键,是两个表之间的关系……它本身不处理过滤,简单地说——它没有这个特征。这不是 django 的事情,这是 数据库 的事情。 Django ORM 并不像您想象的那样远离数据库,它很出色但并不神奇。

一些可用的解决方案是:

  • 通过过滤查询集在 FormField 级别执行此操作
  • 使用类似 django-smart-selects 的东西(这就是上面的)
  • 覆盖模型上的save,在那里添加检查,如果失败则抛出错误
  • status 设置为属性并在设置时对其进行验证检查

如果您使用 FormField 方法并覆盖 save,您将受益于知道 Choice 是不可能的从用户端(填写表单)或后端(在 Choice 实例上调用 .save() 的代码。

关于python - 如何将外键选择限制为同一模型中的另一个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17359790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com