2017-06-06 77 views
1

我正在開發一個Django項目,其中包括兩個有關係的模型。在Django模型中正確定義這種數據關係

第一個模型通常描述了一道菜。它有一個名字和其他一些基本信息,比如:

dish(models.Model): 
    name = models.CharField(max_length=100) 
    short_desc = models.CharField(max_lenght=255) 
    vegetarian = models.BooleanField(default=False) 
    vegan = models.BooleanField(default=False) 

第二種模式是關係到菜,我想在一到一個關係的形式。該模型包含準備和成分。這些數據可能會隨着時間而改變(例如調整準備文本)。這個文本的舊版本仍然存儲,但沒有連接到盤子。所以這道菜得到了一個新的領域,它指向當前的準備文本。

preparation = models.???(???) 

所以,每當準備說明發生變化的新條目的編寫創建和菜的參考的準備更新。

本身看起來像這樣的準備:

preparation(models.Model): 
    prep_test = models.TextField() 
    ingredients = models.TextField() 
    last_update = models.DateTimeField() 

如前所述,我認爲,一個對一個的關係將是dishpreparation之間合理。

我對一對一關係的假設是否正確?如果是,我該如何正確定義它?

回答

2

如果您有多種菜餚準備工作,則根據定義您沒有一對一的關係。

定義這個的方法是從準備到盤的ForeignKey。 (請注意,Python的風格是上課的時間與一個大寫字母。)

class Preparation(models.Model): 
    ... 
    dish = models.ForeignKey('Dish') 

現在你可以做my_dish.preparation_set.latest('last_update')獲得了一盤最新的準備。如果您將內部Meta類添加到「準備」並定義get_latest_by = 'last_update'),則可以省略參數latest()呼叫。

+0

這是有道理的,謝謝你的幫助 – SaAtomic

2

確保關係是正確的,否則你在你的模型中重複元組,這不是很好的做法,使你的數據庫非常沉重。從我的角度看關係。

class dish(models.Model): 
    name = models.CharField(max_length=100) 
    short_desc = models.CharField(max_lenght=255) 
    vegetarian = models.BooleanField(default=False) 
    vegan = models.BooleanField(default=False) 

class Ingredients(models.Model): 
    name = models.CharField(max_length=100) 
    dish = models.ForeignKey(dish) 

class preparation(models.Model): 
    prep_test = models.TextField() 
    last_update = models.DateTimeField() 
    dish = models.OneToOneField(dish) 
1

爲什麼你不做菜的準備與關係。

我盤有多個準備,但只有一個活動。您可以將最新的關於last_update = models.DateTimeField()

基地的模式將是這樣的:

class preparation(models.Model): 
    dish = models.ForeignKey(dish) 
    ...