【问题标题】:ForeignKey between Django Models abstract base classesDjango 模型抽象基类之间的 ForeignKey
【发布时间】:2020-01-19 10:05:55
【问题描述】:

我有一个 Django 应用程序,我想在其中使用一组抽象基类来定义某些模型。我想通过外键连接其中一些抽象模型。

我知道 Django 不允许 models.ForeignKey 抽象模型。我在 StackOverflow 上进行了一些搜索,一般的共识解决方案似乎是 - 使用 GenericForeignKey。但是,据我了解,这会导致额外的 db 级 SELECT 调用。我想避免这种情况,因为我的很多抽象模型都有这种关系。下面给出一个例子:

class Person (models.Model):
    name = models.CharField (max_length=256)

    class Meta:
        abstract = True


class Phone (models.Model):
    phone_no = models.BigIntegerField ()
    owner = models.ForeignKey (Person) # This is, of course, wrong. I'd like something like this.

    class Meta:
        abstract = True

除了关于 GenericForeignKey 的帖子外,我还看到了一篇关于动态模型生成的帖子。链接如下。问题发布者自己提供了答案。

Defining an Abstract model with a ForeignKey to another Abstract model

我想问一下:

  1. 如果当前版本的 Django 仍然如此,
  2. 如果有任何我应该注意的警告,并且
  3. 是否有更现代的解决方案?

谢谢。

【问题讨论】:

  • 你为什么要把Person抽象化?引用抽象类有点“无意义”,因为没有真正的表作为目标。
  • 在两个抽象模型之间存在外键关系是不合逻辑的。抽象模型的存在就是为了继承。具体模型必须继承抽象模型。数据库中没有抽象模型的表。我认为您应该寻找替代解决方案。

标签: python django


【解决方案1】:

我已经解决了这个问题。正如 Willem 和 Mohit 指出的那样,我错误地思考了这个问题(我来自 Cpp 世界,对 Python/Django 编程思维非常陌生)。

我最终定义了没有任何关系的抽象类,然后从这些抽象类派生的具体类实际定义了关系。这也符合 DRY 原则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2016-04-19
    • 1970-01-01
    • 2018-08-21
    • 2015-08-01
    • 2018-03-07
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多