2011-09-29 39 views
0

林不知道我明白多表繼承的優點/目的...但它可能是我正在尋找。我正在處理餐廳。我目前的邏輯是,我有一個Company模型,可能(但並非總是)餐廳。有時候公司可以成爲「母公司」,在這種情況下,Company模型與Branch模型具有一對多關係。 CompanyBranch模型都將具有公共字段,例如街道地址,聯繫信息。如果公司只有一個「分支」,我可以認爲它是餐廳本身,所以我不需要將Branch對象附加到Company。這有意義嗎?我知道我重複自己的街道地址,但它似乎是一個優雅的方式來存儲數據,如果我要直接讀取數據庫。Django中的多表繼承。我不知道我明白

林不知道是否多表繼承是我需要的。我只是看不到https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

編輯:也開放採取任何建議,如果我做錯了一個更好的數據庫佈局。

回答

2

模型繼承在一般情況下很有用,因爲您執行像Company.objects.all()這樣的查詢來返回所有公司(包括餐館)以及Restaurant.objects.all()僅返回餐館公司。就像「常規」繼承一樣,在所有子模型(餐廳)的父級(公司)模型中包含常用字段可能會有所幫助。例如,所有公司都可能有地址字段,但只有餐館可能有food_type字段。

我記錄了幾個片段的鏈接,實現了一個「子類化查詢集」,它基本上可以讓你做一個類似於Company.objects.all()的查詢,並讓它返回給你[<公司> <餐廳> ,<公司>,<公司>,<餐廳>]。退房的鏈接:

http://jazstudios.blogspot.com/2009/10/django-model-inheritance-with.html

該多表方法的缺點是,它介紹了公司父表和子餐桌之間您的查詢的額外加入。

alternatieve將創建一個抽象模型。這將爲公司和帶冗餘文件的餐廳創建一個單獨的表格。在多表繼承的情況下,如果我們想查找一個Restaurant實例的地址字段,我們會引用(在幕後)相關的Company模型。對於抽象繼承,實際上餐廳表中會有一個地址字段。此外,使用抽象繼承,我不認爲你可以做Company.objects.all(),並期望它會返回作爲Restaurants添加的實例,也不能使用上面鏈接的snippits中的子類化查詢集。

希望這會有所幫助, Joe