Django:在这种情况下使用抽象基础模型是个好主意吗?

时间:2010-01-25 21:59:49

标签: django django-models django-managers

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)

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

2 个答案:

答案 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的普通默认管理器。
  •   

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

尽量不要将所有内容都放在一个经理中,只是为了能够在很多课程中只使用一个经理。