2016-01-08 140 views
0

我在django 1.4項目中有一個函數,它將模型實例數據保存到數據庫中。說下面是查看功能Django 1.4交易到Django 1.8交易

def view1(request): 
    # processing request and saving model1 data 
    model1.save() 

有一些芹菜任務定期運行,不斷檢查剛剛保存的數據!所以我想確保函數中的數據被保存,並且在該交易期間數據將被保存,然後它將可用於芹菜任務

所以我做了類似的事情:下面的代碼做了什麼,它確信,芹菜任務是隻有在此之後交易結束

def view1(request): 
    # processing request and saving model1 data 
    with transaction.autocommit: 
     model1.save() 

現在,在Django 1.8,我看到Django的已經改變了它的自動提交行爲的執行,(是嗎?)現在一切都工作在自動提交模式, 我現在應該怎麼做?

+0

我不確定我明白你爲什麼在使用'transaction.autocommit'之前。在調用'model1.save()'之後,你有'view1'中的代碼,但是你想提交事務以便Celery能夠立即看到保存的對象?或者你是否在視圖的'處理請求和保存模型1數據'部分中保存了對象,並且在調用'model1.save()'之前,你不希望事務被提交?或者是其他東西? – Alasdair

+0

是的,我在model1.save()之前和之後有很多代碼。這之後/之前的代碼實際上使得芹菜假定model1存在於數據庫中。所以我的竅門是在自動提交模式下打開一個事務。所以我的問題是,如果django現在以自動提交模式運行,我現在應該做什麼? transaction.atomic()? – user3548288

回答

0

從我可以在默認情況下,現在

告訴它從docs

自動提交初始接通。如果你關掉它,你有責任恢復它。

也有atomic事務,其中更改將只適用於數據庫如果沒有任何問題。

+0

注:我承認我可能誤解了你的問題。 – Sayse

0

在Django 1.6中,默認情況下已啓用自動提交。如果您想在事務中運行一段代碼,則將其包裝在atomic塊中。

def view1(request): 
    with transaction.atomic() 
     # processing request and saving model1 data 
     model1.save() 
    # extra code that will run outside of the transaction 

一旦原子塊已經完成,芹菜就能看到更新model1在數據庫中,即使在視圖的末尾有額外的代碼運行。