【问题标题】:How can I define a polymorphic relation between models in Django?如何在 Django 中定义模型之间的多态关系?
【发布时间】:2010-09-29 18:47:24
【问题描述】:

我正在开发一个包含 Offer 模型的 Django 应用程序。 Offer 实例包含定价条件并指向产品定义。产品模型实际上是一个层次结构(我有一个Television 模型,一个Camcorder 模型等)。所以我希望Offer 模型包含一个多态(或“通用”)关联以指向任何产品。

目前,我所发现的只是使用generic associations in the ContentTypes application。这可能会,但我正在寻找替代品,如果有的话。

感谢您的帮助。

(请每个答案提供一个解决方案)

【问题讨论】:

    标签: django django-models polymorphism associations


    【解决方案1】:

    您可能想看看model inheritance

    【讨论】:

    • 我显然同意,但是请您详细说明答案,以使其对提出问题的人真正有用。这样我就可以 +1 了。
    • 谢谢,但我认为这不是答案。我需要的是: class Offer(models.Model): product = models.ForeignKey(Product) ... 其中 Product 是抽象类,实际引用的对象是具体子类的实例。有什么想法吗?
    【解决方案2】:

    看看django-polymorphic,这个实现了这个功能,内部也使用了ContentTypes。

    【讨论】:

      【解决方案3】:

      你不能在 Django 中这样做。使用 generic relations 或添加此功能的 Django 应用程序,例如 django_polymorphic

      【讨论】:

        【解决方案4】:

        ContentTypes 是正确的方法。 这是因为 ForignKey 只能指向一种类型的表,因此您需要通过中间表并根据不同的类型进行拆分。

        所以类层次结构的模型继承,外键的 ContentType。

        【讨论】:

          【解决方案5】:

          如果您只需要指向“任何产品”而不是任何模型,那么解决方案是拥有一个所有产品都继承自的 Product 模型(即,TV 和 Camcorder 都是 Product 的子类),并给出您的 Offer 模型产品的外键。

          【讨论】:

          • 是的,这是一般的想法,但如果我只这样做,那么我有两个缺点:第一,我不能使用多表继承,第二,当我从报价到产品时,我得到一个 Product 实例而不是 Camcorder(或其他具体类)实例。
          • 如果您在创建时将 FK 存储到“子”ContentType (Camcorder),您可以自动将 Product 实例转换为(例如)Camcorder 实例。更多讨论groups.google.com/group/django-users/browse_thread/thread/…
          • “我不能使用多表继承”是什么意思?多表继承是 Django 实现从非抽象基类继承的方式(不像 Rails,它执行单表继承)。您在这里的选择是继承或泛型关系;没有其他灵丹妙药。
          猜你喜欢
          • 2015-02-03
          • 2012-09-12
          • 1970-01-01
          • 1970-01-01
          • 2015-07-31
          • 1970-01-01
          • 1970-01-01
          • 2011-02-15
          • 1970-01-01
          相关资源
          最近更新 更多