2016-01-08 3 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' раньше. У вас был код в 'view1' после вызова' model1.save() ', но вы хотели зафиксировать транзакцию, чтобы сельдерей мог сразу увидеть сохраненный объект? Или вы сохранили объекты в разделе «запрос на обработку и сохранение данных модели1» в представлении, и вы не хотели, чтобы транзакция выполнялась до тех пор, пока вы не назовете «model1.save()»? Или что-то другое? – Alasdair

+0

Да У меня много кода после и до model1.save(). Этот код «после/до» действительно делает сельдерей предполагать, что модель1 существует в базе данных. поэтому мой трюк состоял в том, чтобы открыть транзакцию в режиме autocommit. так что мой вопрос: если django работает в режиме autocommit сейчас, что мне теперь делать? transaction.atomic()? – user3548288

ответ

0

Из того, что я могу сказать, ИТС по-умолчанию

От docs:

автокоммит изначально включен. Если вы отключите его, вы несете ответственность за его восстановление.

Есть также atomic транзакции, в которых изменения будут применены только к db, если нет никаких проблем.

+0

Примечание: Я допускаю, что, возможно, неправильно понял ваш вопрос. – Sayse

0

В Django 1.6 autocommit был включен по умолчанию. Если вы хотите запустить блок кода в транзакции, тогда оберните его в блок 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 в базе данных, даже в то время как дополнительный код в конце представления работает.

Смежные вопросы