【问题标题】:Why can't I create a ForeignKey field to a child class in django?为什么我不能在 django 中为子类创建 ForeignKey 字段?
【发布时间】:2012-11-04 09:52:58
【问题描述】:

类Folder继承自类Item,它有一个Folder的外键:

class Item(models.Model):
    # some fields
    folder = models.ForeignKey('Folder')

class Folder(Item):
    # some fields

当我尝试运行它时,我得到了错误:

app.item: 'folder' has a relation with model Folder, which has either not been installed or is abstract

我认为正确的做法是将型号名称放在引号中,我已经这样做了,但这似乎没有帮助。我应该怎么做才能完成这项工作?

编辑:使用有意义的类名澄清问题

【问题讨论】:

  • 我已经阅读了该内容,但没有发现它可以涵盖此案例。 A 不是抽象类。我知道如果B 的实例是A,我可以用A.b 得到它,但我试图将它完全链接到另一个对象。
  • 对于初学者来说,这在概念上是错误的。 A 有一个指向 B 的 ForeignKey,B 继承了 AB 的引用。
  • 这是有意的。我希望AB 都有一个指向B 的ForeignKey。
  • 我想你不明白。这是一个无限的关系定义。这两个模型都没有得到定义。

标签: python django


【解决方案1】:

我有项目 (A),其中一些是文件夹 (B)。我想要两个课程 最多只能引用一个文件夹

这没有多大意义(对我来说)你想做的事,但这可以实现 如下:

class Item(models.Model):
    # some fields
    is_folder = models.BooleanField(default=False)
    some_other_folder = models.ForeignKey('self', null=True, blank=True)

然后用python代码检查如果is_folder==False,那some_other_folder 不是无(空)。

所以实际上你不需要 2 个模型。

【讨论】:

  • 这是一个非常有趣的想法。
  • 为了扩展您的答案,我仍然可以通过创建更改默认字段值的代理模型来拥有 Folder 类。见gist.github.com/4088912
  • @hughes 我认为你在那里所做的更干净,更 django-ish。非常好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
相关资源
最近更新 更多