class Account(models.Model):
identifier = models.CharField(max_length=5)
objects = MyCustomManager()
class Meta:
abstract = True
class Customer(Account):
name = models.CharField(max_length=255)
如果我有很多型号,并且我想节省时间,不必到处放置外国人,这是对的吗?或者,我是否认为这一切都错了?
答案 0 :(得分:1)
在这种情况下,您将拥有1个具有帐户ID的客户表,如果您要添加工作人员,他将拥有自己的帐户ID表。
我认为您可能希望单个表与帐户和附加对象客户,工作人员等?通过这种方式,您永远不会混淆您的帐户。
答案 1 :(得分:1)
取决于外键的走向。 不能拥有抽象类的外键。
也许Generic Relations对您或foreign keys in abstract model classes感兴趣。
虽然注意到继承始终是is-a
关系,而正常的外键使用意味着has-a
关系。
在您的示例中,Customer
不应继承Account
,因为客户拥有帐户。
继承示例是 Place ,它是 Restaurant 或 Cinema 等。
评论后修改:
嗯,documentation中有一个自己的部分:
类继承和模型管理器并不是完全匹配的。管理人员通常特定于他们在上定义的类,并在子类中继承它们不一定是个好主意。此外,因为声明的第一个管理器是默认管理器,所以允许控制它是很重要的。所以这里是Django如何处理自定义管理器和模型继承:
...
- 抽象基类的管理器总是由子类继承,使用Python的常规名称解析顺序(子类上的名称覆盖所有其他名称;然后在第一个父类上出现名称,依此类推)。抽象基类旨在捕获其子类共有的信息和行为。定义共同管理者是这一共同信息的适当部分。
- 类上的默认管理器是在类上声明的第一个管理器(如果存在),或者是父层次结构中第一个抽象基类的默认管理器(如果存在)。如果没有显式声明默认管理器,则使用Django的普通默认管理器。
如果继承的类在某种程度上属于同一范围,我只会这样做 如果您真的有这么多类,那么在这些类中添加一行很重要,那么您可能没有一个好的数据库或应用程序设计。
尽量不要将所有内容都放在一个经理中,只是为了能够在很多课程中只使用一个经理。