这是交易:
我有两个数据库模型,比方说ShoppingCart
和Order
。遵循DRY原则,我想将一些常见的道具/方法提取到共享接口ItemContainer
中。
一切顺利,直到遇到主要对相关对象集执行删除的_flush()
方法。
class Order(models.Model, interface.ItemContainer):
# ...
def _flush(self):
# ...
self.orderitem_set.all().delete()
所以问题是:我如何动态地知道它是orderitem_set
还是shoppingcartitem_set
?
答案 0 :(得分:3)
首先,这里有两个Django片段,应该是您正在寻找的:
其次,您可能需要重新考虑您的设计并切换到具有简单content types framework方法的django.contrib .model_class()
。 (上面发布的第一个代码段也使用内容类型框架。)
第三,您可能不希望在模型类中使用多重继承。它不应该被需要,如果有一些模糊的副作用我也不会感到惊讶。只需interface.ItemContainer
继承models.Model
,然后Order
仅继承interface.ItemContainer
。
答案 1 :(得分:2)
您可以设置ForeignKey的related_name参数,因此如果您想对设计进行最小的更改,您可以让ShoppingCartItem和OrderItem分别在其ForeignKeys上设置相同的related_name到ShoppingCart和Order(类似于“item_set”) “):
order = models.ForeignKey(Order, related_name='item_set')
和
cart = models.ForeignKey(ShoppingCart, related_name='item_set')