Django多表继承与Postgres表继承不同

3
我是一位有用的助手,可以为您翻译文本。

所以我正在研究Django的多表继承,以及它与Postgres的表继承的区别。

假设我有以下模型:

models.py

class Mayor(models.Model):
    name = models.CharField(max_length=255)


class City(models.Model)
    name = models.CharField(max_length=255)
    mayor = models.ForeignKey(Mayor, on_delete=models.CASCADE)


class Capital(City):
    embassy = models.BooleanField(default=False)


现在,如果我按照这个构建数据库,得到的表格大致如下:
cities:
+----------+------------------------+---------------------------------------------------------+
| Column   | Type                   | Modifiers                                               |
|----------+------------------------+---------------------------------------------------------|
| id       | integer                |  not null default nextval('main_city_id_seq'::regclass) |
| name     | character varying(255) |  not null                                               |
| mayor_id | integer                |  not null                                               |
+----------+------------------------+---------------------------------------------------------+

capitals
+-------------+---------+-------------+
| Column      | Type    | Modifiers   |
|-------------+---------+-------------|
| city_ptr_id | integer |  not null   |
| has_embassy | boolean |  not null   |
+-------------+---------+-------------+

这不是一个理想的方法,因为这意味着要获取首都市长,我需要进行两次连接,一次从capitalscities,然后从citiesmayors
在Postgres中,我们可以这样做:
cities:
+------------+-------------+------------------------------------------------------+
| Column     | Type        | Modifiers                                            |
|------------+-------------+------------------------------------------------------|
| id         | integer     |  not null default nextval('cities_id_seq'::regclass) |
| name       | text        |                                                      |
| mayor_id   | realinteger |                                                      |
+------------+-------------+------------------------------------------------------+

where the below table is listed as a 'child'

capitals:
+------------+--------------+------------------------------------------------------+
| Column     | Type         | Modifiers                                            |
|------------+--------------+------------------------------------------------------|
| id         | integer      |  not null default nextval('cities_id_seq'::regclass) |
| name       | text         |                                                      |
| mayor_id   | realinteger  |                                                      |
| embassy    | bool         |                                                      |
+------------+--------------+------------------------------------------------------+

有没有办法在Django中使用Postgres的表继承?

提前致谢


1
不,Django并非针对特定数据库,并且某些功能尚未实现。此外,DDL继承存在一些注意事项需要在使用前考虑。Django的功能票据可以在此处找到 https://code.djangoproject.com/ticket/24632 - iklinac
1
如果你正在寻找Django中的单表继承,这个链接可能会有所帮助:https://dev59.com/-HVC5IYBdhLWcg3wnCWA - iklinac
1
谢谢@iklinac,但我正在寻找多表。我认为一定有人已经为此构建了一个包,但似乎没有人这样做,所以我想决定自己构建一个。 - Tom Hamilton Stubber
1个回答

2
不幸的是,这个功能既没有在 Django 本身中实现,也没有在任何第三方包中实现。甚至可能无法创建一个第三方包,而不对 Django 的核心做出一些重大改变。
如果您对此功能感兴趣,请参见 Django 的 bug 追踪器中关于此精确功能的 ticket
请记住,这种类型的继承确实有一些主要限制,例如指向父表的外键不能处理子实例,索引不共享父和子之间(没有针对覆盖父级和所有子表的唯一性的即用型解决方案)等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接