2012-11-28 102 views
1

我有一個代碼,像這樣Django的交易

def many_objects_saving(list_of_objects): 
    for some_object in list_of_objects: 
     # do smth with an object 
     some_object.save() 

據我所知,Django是會打的數據庫,每次它達到保存()的代碼。因此,這裏有兩個問題:

  1. 如果我會在另外一個使用此功能,並使其包裹着transaction.commit_on_successtransaction.commit_manually裝飾,將Django的做,在短短一個事務中的所有保存和訪問數據庫以下(內一個函數)?

例如:

def resave_objects(model, condition): 
    list_of_objects = model.objects.filter(**condition) 
    many_objects_save(list_of_objects) 

@transaction.commit_on_success 
def many_objects_save(list_of_objects): 
    for some_object in list_of_objects: 
     # do smth with an object 
     some_object.save() 

2.如果是這樣,這將是對大型查詢集更好? 謝謝你們!

回答

3

所有保存將包裝到單個事務中,但不包含在單個查詢中。使用交易不會改變您所做的號碼查詢。

事務不是爲了性能,而是爲了數據的完整性。如果您將視圖封裝在事務中並且在某些時候失敗(可能是中間的某些數據錯誤並且無法從錯誤中恢復),則可以中止事務,並且事務中的以前的查詢都不會將對數據庫產生任何影響。這樣,您可以確保您沒有來自失敗請求的半成品數據。

如果您的問題是大量保存的性能,您可以使用批量刪除/創建方法。這是一個example of it in a project of mine。這個想法是,您刪除一個查詢中的所有對象,然後在一個查詢中重新創建它們的所有新值。它在所有情況下都不起作用,但它可能會訣竅。

+0

謝謝!!!))) –