2014-01-14 80 views
0

我想給一個分類,以每一個配方,我需要3個級別( - >類 - >子類主題)模型。我有以下型號:Django的 - 有兩個以上的外鍵

class Recipe(models.Model): 
    content = HTMLField() 
    ... 

class Subject(models.Model): 
    name = models.CharField() 

class Category(models.Model): 
    subject = models.ForeignKey(Subject) 
    name = models.CharField() 

class Subcategory(models.Model): 
    category = models.ForeignKey(Category) 
    name = models.CharField() 

起初,我當時就想,一個ForeignKey添加到配方模型,是這樣的:

subcategory = models.ForeignKey(Subcategory) 

所以我能夠從子類去主題,做一個簡單的加入。

但也許是更好地創建一個新表,以提高性能並有一個可擴展的系統,這是我的想法:

class Classification(models.Model): 
    recipe = models.ForeignKey(Recipe) 
    subject = models.ForeignKey(Subject) 
    category = models.ForeignKey(Category) 
    subcategory = models.ForeignKey(Subcategory) 

利用這最後的解決方案,我想選擇從配方管理的子類別面板,然後自動填寫其他字段(類別和主題)。我的問題是:我該怎麼做?

謝謝!

回答

2

你的第一個設計其實是最好的。這是一個完全denormalized database design。第二個設計將你的食譜中完全無關的類別的子類別是無關的拍攝對象的可能性。所以,你在性能上獲得的收益可能會在數據完整性方面喪失。

1

的類主題,類別,子類別和配方(以ForeignKey的)創建完全規範化的數據庫設計添加分類是反規範化數據庫(例如性能問題)的一部分。

回答你的問題:

recipe = Recipe.objects.get(pk=1) # just assume that you have object instance under recipe 
r_subcategory = recipe.subcategory 
r_category = r_subcategory.category 
r_subject = r_category.subject 
new_classification = Classification(subject=r_subject, category=r_category, subcategory=r_subcategory, recipe=recipe) 
new_classification.save() 

我真的想知道是否有一個數據庫請求來創建它(我可以很容易地產生對於SQL請求的方式,但我不知道如何實現與Django的ORM一樣)