вложенный @commit_on_success в @commit_manually - PullRequest
1 голос
/ 26 марта 2012

Я использую следующую служебную функцию в нескольких сценариях:

@transaction.commit_on_success
def save_something(arg):
    # creation of a model_instance using arg
    model_instance.save()

В одном из сценариев я загружаю множество данных этих моделей в базу данных.Чтобы сделать это эффективным, я пытаюсь сделать:

@transaction.commit_manually
def save_many(arg_list):
    for i,arg in enumerate(arg_list):
        save_something(arg)
        if i%1000==0:
            transaction.commit()

Переопределяет ли commit_manually commit_on_success?
Если нет, как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 28 марта 2012

Посмотрите на этот фрагмент, я думаю, он лучше обрабатывает вложенные коммиты. http://djangosnippets.org/snippets/1343/

0 голосов
/ 26 марта 2012

Вы можете:

@transaction.commit_on_success
def save_something(arg):
    _save_something(arg)

def _save_something(arg):
    # creation of a model_instance using arg
    model_instance.save()

, а затем в том единственном случае, когда вам нужно нужен декоратор бесплатно, используйте _save_something() ...

0 голосов
/ 26 марта 2012

Короткий ответ: «Нет» и «Вы не можете».Что декораторы (и все, что они действительно могут сделать) - это обернуть украшенные ими функции в другую функцию, которая при необходимости запускает транзакцию, а затем вызывает исходную функцию.Это все, что делает функция-оболочка commit_manually декоратора.Декоратор commit_on_success добавляет автоматическую фиксацию или откат в зависимости от успешности обернутой функции.Декораторы - это не "флаги времени выполнения", которые переключаются, и это другое поведение затем отключается.Это просто маленький шаблон, который обернут вокруг вашей функции, а шаблон commit_on_success декоратора всегда будет либо фиксировать, либо выполнять откат.

Источник для декораторов может рассказать вам больше о деталях:1006 *https://code.djangoproject.com/svn/django/trunk/django/db/transaction.py

...