我的Django模型具有以下继承结构:
Transaction
SimpleTransaction
SubscriptionTransaction
Item
SimpleItem
SubscriptionItem
模型SimpleTransaction
引用模型SimpleItem
,类SubscriptionTransaction
引用模型SubscriptionItem
。
最明显的方法是在item
中定义Transaction
字段:
class Transaction(models.Model):
# ...
item = models.ForeignKey('Item')
# ...
但是我希望t.item
引用SimpleItem
来引用SubscriptionItem
或Item
(不是上面代码中的基类t
)是SimpleTransaction
或SubscriptionTransaction
。
在Django中有哪些方法?
或者引用派生类(SimpleItem
或SubscriptionItem
而不是Item
可能会以某种方式严重影响性能,因为它将要求读取SimpleItem
或{{ 1}}甚至只需要SubscriptionItem
字段?因此更好地参考基类而不是发明这样的问题?但是,从Item
或Item
引用特定的Item
派生类(不仅是SimpleTransaction
基类)都有助于引用完整性。那么我应该这样做来提高数据库的“稳定性”吗?
答案 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
我认为没有其他方法可以解决这个问题。