Django

时间:2018-09-16 16:58:53

标签: python django django-models

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

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

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

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

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

但是我希望t.item引用SimpleItem来引用SubscriptionItemItem(不是上面代码中的基类t)是SimpleTransactionSubscriptionTransaction

在Django中有哪些方法?

或者引用派生类(SimpleItemSubscriptionItem而不是Item可能会以某种方式严重影响性能,因为它将要求读取SimpleItem或{{ 1}}甚至只需要SubscriptionItem字段?因此更好地参考基类而不是发明这样的问题?但是,从ItemItem引用特定的Item派生类(不仅是SimpleTransaction基类)都有助于引用完整性。那么我应该这样做来提高数据库的“稳定性”吗?

1 个答案:

答案 0 :(得分:0)

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

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