代码之家  ›  专栏  ›  技术社区  ›  porton

Django中的多态(衍生模型引用)模型继承

  •  0
  • porton  · 技术社区  · 7 年前

    • Transaction
      • SimpleTransaction
      • SubscriptionTransaction
    • Item
      • SimpleItem
      • SubscriptionItem

    模型 简单事务 单纯形 订阅交易 参考模型 下标 .

    item 字段输入 交易

    class Transaction(models.Model):
        # ...
        item = models.ForeignKey('Item')
        # ...
    

    但我想 t.item 单纯形 项目 如上述代码)取决于 t 简单事务 订阅交易 .

    在Django有什么办法?

    单纯形 下标 )而不是 可能会严重影响性能,因为它需要读取 单纯形 下标 即使只是 项目 是否需要字段?所以最好是指基类而不是发明这样的问题?但是有一个特定的 项目 -派生类(不只是 项目 基类) 简单事务 有利于参考完整性。那么我应该这样做来提高DB的“稳定性”吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   porton    7 年前

    另一种解决办法是将 item

    class SimpleTransaction(models.Model):
        # ...
        item = models.ForeignKey('SimpleItem')
        # ...
    # ...
    
    class SubscriptionTransaction(models.Model):
        # ...
        item = models.ForeignKey('SubscriptionItem')
        # ...
    

    但是这样就没有直接的方法(不使用条件运算符或类似的方法)来引用项目中的关联交易:

    i.simpletransaction if i.simpletransaction else i.subscriptiontransaction
    

    所以我认为这种方式是不可接受的。

    但是,可以添加这些属性:

    class SimpleTransaction(Transaction):
        @property
        def simple_item(self):
            return self.item.simpleitem
    
    class SubscriptionTransaction(Transaction):
        @property
        def subscription_item(self):
            return self.item.subscriptionitem
    

    我看没有别的办法解决这个问题。