【发布时间】: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
我想问一下:
- 如果当前版本的 Django 仍然如此,
- 如果有任何我应该注意的警告,并且
- 是否有更现代的解决方案?
谢谢。
【问题讨论】:
-
你为什么要把
Person抽象化?引用抽象类有点“无意义”,因为没有真正的表作为目标。 -
在两个抽象模型之间存在外键关系是不合逻辑的。抽象模型的存在就是为了继承。具体模型必须继承抽象模型。数据库中没有抽象模型的表。我认为您应该寻找替代解决方案。