当前位置: 代码迷 >> python >> Django中的多态(参考派生模型)模型继承
  详细解决方案

Django中的多态(参考派生模型)模型继承

热度:40   发布时间:2023-06-19 09:18:10.0

我的Django模型具有以下继承结构:

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

模型SimpleTransaction引用模型SimpleItem ,类SubscriptionTransaction引用模型SubscriptionItem

最明显的方法是在Transaction定义item字段:

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

但是我希望t.item根据tSimpleTransaction还是SubscriptionTransaction来引用SimpleItemSubscriptionItem (而不是上面代码中的基类Item )。

在Django中有什么方法可以做到这一点?

还是引用派生类( SimpleItemSubscriptionItem )而不是Item可能会对性能造成严重影响,因为即使仅需要Item字段,它也会要求读取SimpleItemSubscriptionItem 因此更好地参考基类而不是发明这样的问题? 但是,从SimpleTransactionSubscriptionTransaction引用特定于Item派生的类(不仅仅是Item基类)会带来参照完整性。 那么我应该这样做来提高数据库的“稳定性”吗?

一种替代解决方案是为“简单”和“订阅”类分别设置一个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

我认为没有其他方法可以解决此问题。