2009-02-05 45 views
4

這裏的交易:如何爲Django相關對象集實現通用接口?

我有兩個db模型,比如說ShoppingCartOrder。遵循DRY原則,我想將一些常用道具/方法提取到共享接口ItemContainer

一切都很順利,直到我遇到_flush()方法,主要對相關對象集執行刪除操作。

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

# ... 

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

所以,問題是:我怎麼知道動態wheter是orderitem_setshoppingcartitem_set

回答

3

首先,這裏是應該你在尋找什麼有兩個Django的片段:

其次,你可能要重新考慮你的設計並切換到具有簡單的.model_class()方法的django.contrib content types framework。 (上面發佈的第一個片段也使用內容類型框架)。

三,你可能不想在模型類中使用多重繼承。這不應該需要,我不會感到驚訝,如果有一些不明確的副作用。只需從models.Model繼承interface.ItemContainer,然後Order僅繼承interface.ItemContainer

+0

實際上,你可以做多重繼承這樣的,它的工作原理沒有問題(只要我可以告訴),但我仍然會可能是從模型繼承ItemContainer (除非它的一個接口t帽子可以適用於非模型對象)。 – 2009-02-05 17:28:44

2

您可以設置ForeignKey的related_name參數,因此如果您想對設計進行最小限度的更改,則可以將ShoppingCartItem和OrderItem分別在ForeignKeys上設置爲ShoppingCart和Order(分別爲「 item_set「):

order = models.ForeignKey(Order, related_name='item_set') 

cart = models.ForeignKey(ShoppingCart, related_name='item_set')