【问题标题】:Django: Is it a good idea to use an abstract base model in this situation?Django:在这种情况下使用抽象基础模型是个好主意吗?
【发布时间】:2010-01-25 21:59:49
【问题描述】:
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)

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

【问题讨论】:

    标签: django django-models django-managers


    【解决方案1】:

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

    也许你感兴趣的是Generic Relationsforeign keys in abstract model classes

    虽然请注意继承始终是is-a 关系,而正常的外键用法暗示has-a 关系。

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

    继承示例是 Place,它可以是 RestaurantCinema 等。

    评论后编辑:

    好吧,documentation 中有一个专门的部分:

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

    ...

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

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

    并且尽量不要将所有内容都放在一位经理身上,以便能够在很多课程中只使用一位经理。

    【讨论】:

    • 如果我创建一个名为 CustomManagerModel(models.Model) 的抽象类并将其子类化(不是为了记录目的,而是让它使用我希望大多数类使用的管理器)。
    • @dmishe:澄清一下,它是继承管理器,而不是子类化(这是不同的)。
    • @both 谢谢大家,但我的意思是我可以子类一个具有客户经理的模型,只是为了共享它的经理(但没有抽象类通常涉及的“是 A”关系吗?
    • 您必须更好地阅读我的回答:“抽象基类旨在捕获其子类共有的信息和行为。定义公共管理器是此公共信息的适当部分。” is-a, has-a 只是模型的逻辑视图,它应该可以帮助您构建模型。
    【解决方案2】:

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

    我认为您可能希望有一个包含帐户和附加对象客户、工人等的表?这样您就不会混淆您的帐户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2011-12-23
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多