2013-11-28 56 views
4

我有這個django views.py方法,旨在將許多數據插入數據庫。它通過模型數組循環,並且如果一個對象不在數據庫中,它將被插入。如何強制django立即保存,而不是在循環後進行批量更新

這是代碼的樣子:

def update_my_db(request): 

    a_models = A_Model.objects.filter(my_flag=True) 

    for a_model in a_models: 

     b_model_array = [] 

     [...] # this is where b_model_array gets filled 

     for index in range(len(b_model_array)): 

      current_b_model = b_model_array[index] 

      try: 
       b_model = B_Model.objects.get(my_field=current_b_model.my_field) 
      except (KeyError, B_Model.DoesNotExist): 
       b_model = B_Model.objects.create(field_1=current_b_model.field_1, field_2=current_b_model.field_2) 
       b_model.save() 

    return HttpResponse(response) 

我已經經過多次測試,該數據庫只由最後一次迭代結束時更新注意到,彷彿Django的等待做批量插入到MySQL 。

問題是:任何迭代都有引發異常的可能性,使得到目前爲止所收集的所有數據因錯誤而被丟棄(已經過測試和確認)。當增加400條新線時,在循環#399處引發異常並放棄所有先前的398條線對我來說是非常不合適的。

我知道配料是關於性能的最佳選擇,但這是一個後臺程序,所以我並不擔心它。

底線:有沒有一種方法可以強制django在每次迭代時更新數據庫?

回答

2

如果你在Django的1.6,看看這個:https://docs.djangoproject.com/en/dev/topics/db/transactions/

你感興趣的是頁面的上下文管理部分:

from django.db import transaction 

def viewfunc(request): 
    # This code executes in autocommit mode (Django's default). 
    do_stuff() 

    with transaction.atomic(): 
     # This code executes inside a transaction. 
     do_more_stuff() 
相關問題