如何为Django相关对象集实现通用接口?

时间:2009-02-05 09:24:37

标签: django django-models interface dry

这是交易:

我有两个数据库模型,比方说ShoppingCartOrder。遵循DRY原则,我想将一些常见的道具/方法提取到共享接口ItemContainer中。

一切顺利,直到遇到主要对相关对象集执行删除的_flush()方法。

class Order(models.Model, interface.ItemContainer):

# ...

def _flush(self):
    # ...
    self.orderitem_set.all().delete()   

所以问题是:我如何动态地知道它是orderitem_set还是shoppingcartitem_set

2 个答案:

答案 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')