【发布时间】:2013-06-25 22:28:57
【问题描述】:
我正在制作一个 django 应用程序,但遇到了一个问题。我正在尝试定义一个模型,其中一个 ForeignKey 将依赖于另一个 ForeignKey。
说明部分
我的申请是关于做出选择的。
假设您要创建一个decision,一个decision 有多个choices,一个choice 有一个status(由于其他限制)。
status 可以用于多个choices,但status 只能与一个decision 相关,choice 链接到同一个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 question (In django, how to limit choices of a foreignfield based on another field in the same model?) 处理相同的问题,但问题已经过时了,最好的答案是依赖外部应用程序 (django-smart-selects)。
我宁愿不必使用外部的东西,而且我不明白为什么仅使用 Django 无法解决像 3 表关系这样简单的问题!
如果有人有任何解决方案或任何建议,请告诉我。
【问题讨论】:
-
你看this answer了吗?
-
@karthikr 当我想将其直接应用于模型时,此答案适用于表单(同时简化了管理员管理)。但如果这不可能,这可能是我会选择的路径。
-
嗯,你也可以在管理表单中做同样的事情。我知道它是多余的,但在你找到更好的方法之前,这可以工作
-
这不能在模型级别完成;它只能在表单级别和数据库级别完成。
-
@Jerska 无法使用
django-smart-selects,因为它在模型级别不起作用。它适用于表单级别。
标签: python django database-design django-models