2017-02-14 49 views
0

假設我有以下型號:Python/Django確保來自外鍵的對象將保持相同的順序嗎?

class Case: 
    case_name = models.CharField(max_length=200) 

class SubTask: 
    subtask_name = models.CharField(max_length=200) 
    case = models.ForeignKey(Case, on_delete = models.CASCADE) 

假設我創建順序 SubTask類ST1的四個對象,ST2ST3ST4和他們的情況屬性設置爲案例實例C。現在的問題是,當我做這個循環:

for subtask in SubTask.objects.filter(case=C): 
    #Do something to subtasks 

是否保證通過Python或Django的是,在這個循環中的對象會出現的順序ST1,ST2,ST3,然後ST4?或者它只保證四個對象以任何順序循環播放?

注意:我確實嘗試了它們,並且它們是按實例化的順序排列的,但是我想確保這種行爲是有保證的,因爲排序很重要。

回答

3

Django不強制執行任何命令,除了您自己提供的任何命令。如果您的SubTask模型在其Meta類中有ordering屬性,那麼子任務將始終以這種方式排序;或者,您可以在過濾時明確提供order_by子句。

否則,Django只是按照數據庫提供的順序提供這些項目。請注意,儘管dbs可能會按您想要的順序返回事物,但嚴格地說,如果沒有明確說明,SQL中的order是未定義的。

+0

是否有任何內置的方式使用ORDER_BY使這個排序(???),或者我需要添加一個「created_at」屬性添加到模型,並將其設置爲時區.now()當對象被創建時? – AspiringMat

+0

確保插入順序的唯一方法是添加時間戳字段,是的。請注意,如果在定義中使用'auto_now_add = True',則Django將自動設置創建日期。 –

+0

太棒了!謝謝您的幫助 :-) – AspiringMat

0

只需遍歷主鍵以確保對象按照添加到數據庫的順序迭代。

for subtask in SubTask.objects.filter(case=C).order_by('pk'): 
    #Do something to subtasks 
相關問題