Django,多表继承有那么糟糕吗?

eug*_*ene 4 django database-design model

这并不是 django 特有的。

一罐模型

Place (with location, name, and other common attributes)
 - Restaurant  (menu..)
 - ConcertHall  (hall size..)
Run Code Online (Sandbox Code Playgroud)
  1. 在两个单独的表中,让每个表保存它们需要的所有字段。(在django世界中,这称为抽象继承)
  2. 在三个表中,其中一个包含公共字段,另外两个有自己的唯一字段。(django中的多表继承)

《Two scoops of Django 1.8》一书的作者强烈建议不要使用多表继承。

假设您想根据位置查询地点并对结果进行分页(它不必是位置,可以是我们要过滤的任何其他常见属性)

我可以看到如何使用多表继承来实现它。

select place.id from place LEFT OUTER JOIN "restaurant" on (restuarant.id=place.id) LEFT OUTER JOIN "concerthall" on (concerthall.id=place.id) where ... 按距离排序

用抽象继承来实现可行吗?

Wto*_*wer 5

根据Django 文档:模型继承

您必须做出的唯一决定是您是否希望父模型本身成为模型(具有自己的数据库表),或者父模型是否只是仅通过子模型可见的公共信息的持有者。

我认为这两种可能性都只是工具,同样是好的工具,这仅取决于您的用例是否合适。当然,这两种方法都需要考虑特定的事情,并且从概念上讲,有时多表继承可能更难以理解,但除此之外,这个主题就会变得固执己见。

如果您的两个模型都需要一个查询集,那么您考虑多表继承而不是抽象模型是合乎逻辑的,因为否则您将需要将两个查询集合并为一个,最有可能通过使用列表(如此相关答案所示) ,但是你肯定会失去 ORM 功能。