2
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)

如果我有很多模型,并且我想节省时间,不必到处放外键,这是对的吗?或者,我认为这一切都错了吗?

4

2 回答 2

1

在这种情况下,您将拥有 1 个具有帐户 ID 的客户表,如果您添加 Worker,他将拥有自己的具有帐户 ID 的表。

我想你可能想要一个带有帐户和附加对象客户、工人等的表?这样您就永远不会混淆您的帐户。

于 2010-01-25T22:52:16.127 回答
1

这取决于外键的方向。抽象类不能外键。

也许你感兴趣的是通用关系或抽象模型类中的外键

尽管请注意继承始终是一种is-a关系,而正常的外键用法暗示着一种has-a关系。

在您的示例中,Customer不应继承自Account客户拥有帐户。

一个继承的例子是一个地方,它要么是餐厅,要么是电影院等。

评论后编辑:

好吧,文档中有一个自己的部分:

类继承和模型管理器并不是彼此完美的匹配。管理器通常特定于定义它们的类,在子类中继承它们不一定是个好主意。此外,因为声明的第一个管理器是默认管理器,所以允许对其进行控制很重要。下面是 Django 处理自定义管理器和模型继承的方式:

...

  • 抽象基类的管理器总是由子类继承,使用 Python 的正常名称解析顺序(子类上的名称覆盖所有其他名称;然后是第一个父类上的名称,依此类推)。抽象基类旨在捕获其子类共有的信息和行为。定义共同管理者是该共同信息的适当部分。
  • 类的默认管理器是在该类上声明的第一个管理器(如果存在),或者是父层次结构中第一个抽象基类的默认管理器(如果存在)。如果没有显式声明默认管理器,则使用 Django 的正常默认管理器。

如果继承的类以某种方式属于同一范围,我只会这样做。
如果你真的有这么多的类,在这些类中添加一行很重要,那么你可能没有一个好的数据库或应用程序设计。

并且尽量不要把所有东西都放在一位经理身上,只是为了能够在很多课程中只使用一位经理。

于 2010-01-25T22:52:28.473 回答