问题描述
我的Django模型具有以下继承结构:
-
Transaction
-
SimpleTransaction
-
SubscriptionTransaction
-
-
Item
-
SimpleItem
-
SubscriptionItem
-
模型SimpleTransaction
引用模型SimpleItem
,类SubscriptionTransaction
引用模型SubscriptionItem
。
最明显的方法是在Transaction
定义item
字段:
class Transaction(models.Model):
# ...
item = models.ForeignKey('Item')
# ...
但是我希望t.item
根据t
是SimpleTransaction
还是SubscriptionTransaction
来引用SimpleItem
或SubscriptionItem
(而不是上面代码中的基类Item
)。
在Django中有什么方法可以做到这一点?
还是引用派生类( SimpleItem
或SubscriptionItem
)而不是Item
可能会对性能造成严重影响,因为即使仅需要Item
字段,它也会要求读取SimpleItem
或SubscriptionItem
?
因此更好地参考基类而不是发明这样的问题?
但是,从SimpleTransaction
或SubscriptionTransaction
引用特定于Item
派生的类(不仅仅是Item
基类)会带来参照完整性。
那么我应该这样做来提高数据库的“稳定性”吗?
1楼
一种替代解决方案是为“简单”和“订阅”类分别设置一个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
我认为没有其他方法可以解决此问题。