2012-03-26 7 views
1

ich die folgende Nutzenfunktion in mehrere Skripte verwenden:verschachtelte @commit_on_success in @commit_manually

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

In einem der Skripte ich viele dieser Modell laden isntances in die Datenbank. Um versuchen zu tun, ich dies effizienter zu machen:

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

Ist die commit_manually überschreiben die commit_on_success?
Wenn nicht, wie kann ich es machen?

Antwort

0

Die kurze Antwort ist "Nein" und "Sie können nicht". Was die Dekorateure (und alles, was sie wirklich tun können) ist, die Funktionen, die sie dekorieren, in eine andere Funktion zu verpacken, die eine Transaktion bei Bedarf startet, und dann die ursprüngliche Funktion aufruft. Das ist die commit_manually Decorator's Wrapper-Funktion. Der commit_on_success Decorator fügt ein automatisches Festschreiben oder ein Rollback je nach dem Erfolg der umbrochenen Funktion hinzu. Die Dekoratoren sind keine "Laufzeit-Flags", die umgeschaltet werden und das andere Verhalten dann deaktiviert. Sie sind einfach ein kleines Boilerplate, das um Ihre Funktion gewickelt wird, und die Boilerplate des Dekorators commit_on_success wird immer entweder festschreiben oder rollback.

Die Quelle für die Dekorateure kann Ihnen sagen, mehr über die Details auf der Hand: https://code.djangoproject.com/svn/django/trunk/django/db/transaction.py

0

Sie können:

@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() 

und dann in diesem einzigen Fall, in dem Sie tun es frei Dekorateur benötigen, verwenden _save_something() ...