2016-08-03 82 views
0

背景結合數據的Django模型:代表從其他2款

我湊2個來源出售即將到來的性能數據,讓我們稱之爲一個SaleAnnouncement和其他SellerMaintainedData。他們共享許多相同的字段名稱(儘管一些數據只能在一箇中找到,而不能在另一箇中找到)。如果某件物品即將出售,則保證是SaleAnnouncement,但不一定是SellerMaintainedData。實際上,只有大約10%的「賣家」在自己的網站上維護相關數據。但是,那些確實擁有更多信息,並且數據比公告中的數據更新。此外,「公告」是自由形式的文本,在提取相關數據之前需要經過幾個處理步驟,因此,該模型有一些字段用於在中間處理步驟中存儲數據(部分原因是我選擇了2模型,而不是將它們合併爲1),而「賣家」數據則以整潔的表格格式進行挖掘。

問題

我最終會喜歡把它們組合成一個SaleItem,並實施了這是關係到以前的2款機型,並在很大程度上依賴於性能優先的數據來自哪個模型從模型。例如:

@property 
def sale_datetime(self): 
    if self.sellermaintaineddata and self.sellermaintaineddata.sale_datetime: 
     return self.trusteeinfo.sale_datetime 
    else: 
     return self.latest_announcement and self.latest_announcement.sale_datetime 

但是,我顯然不能查詢這些字段,這將是我列出即將到來的銷售額時的最終目標。我曾被提出過一種解決方案,它涉及到創建一個覆蓋過濾器/排除方法的自定義管理器,這聽起來很有希望,但我必須複製模型管理器中的所有屬性字段邏輯。

摘要(爲了清楚起見)

我:

class SourceA(Model): 
    sale_datetime = ... 
    address = ... 
    parcel_number = ... 
    # other attrs... 

class SourceB(Model): 
    sale_datetime = ... 
    address = ... 
    # no parcel number here 
    # other attrs... 

我想:

class Combined(Model): 
    sale_datetime = # from sourceB if sourceB else from sourceA 
    ... 

我想去的地方SourceASourceB之間的公共領域是優先所以一個統一的模式如果SourceB存在,則從導出該字段的值或者它來自SourceA。我也想這些領域,所以也許使用性質來查詢是不是最好的辦法...

問題

有沒有更好的辦法,我應該考慮轉型我的模型(可能合併這2)還是定製經理解決方案的路要走?

回答

0

我會建議另一種解決方案。怎麼使用繼承?您可以創建基本類,這將是抽象的(https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-base-classes)。您可以將所有常用字段放在那裏,然後爲SaleAnnouncement和SellerMaintainedData創建單獨的模型。由於它們都將從您的基礎模型繼承,所以您必須定義僅針對特定模型的字段。

+0

雖然這似乎解決了常見字段形式的重複代碼問題,但它並沒有解決將項目鏈接在一起代表一個'SaleItem'的更大問題,這使我可以將它們作爲統一模型來查詢。如果有什麼內容類型框架看起來比抽象基類更適合,但即使這似乎並沒有解決統一我正在尋找 –

+0

我真的很抱歉,我一定誤解了你的問題。我會去定製經理的方法。也許這樣的一個http://stackoverflow.com/questions/17968501/single-custom-manager-for-multiple-models-in-django? – mateuszb