2010-07-09 13 views
5

django model save() yöntemleri are not lazy olarak ve işlemlerin kısa tutulması genel olarak iyi bir uygulama olduğundan, işlem bloklarının sonuna kadar ertelenebilir mi? Örnek olarak, kod örneği B aşağıdaki kod örneği A'dan daha az süre açık bir işlem yapabilir mi?Django - save() tabanlı işlemlere açık

kod örneği A:

from django.db import transaction 
from my_app.models import MyModel 

@transaction.commit_on_success 
def model_altering_method(): 
    for inst in MyModel.objects.all()[0:5000]: 
     inst.name = 'Joel Spolsky' 
     # Some models independent time consuming operations... 
     inst.save() 

kod örneği B:

from django.db import transaction 
from my_app.models import MyModel 

@transaction.commit_on_success 
def model_altering_method(): 
    instances_to_save = [] 
    for inst in MyModel.objects.all()[0:5000]: 
     inst.name = 'Joel Spolsky' 
     # Some models independent time consuming operations... 
     instances_to_save.append(inst) 

    for inst in instances_to_save: 
     inst.save() 

cevap

1

Django'nun varsayılan davranışı, yerleşik, veri değiştirici bir model işlevi çağrıldığında otomatik olarak işlendiği açık bir işlemle çalışmaktır. Commit_on_success veya commit_manually dekoratörleri durumunda django, save() işlevini yerine getirmez, bunun yerine işlev yürütme başarıyla tamamlanırken veya transaction.commit() komutunda çalışır.

nedenle, zarif bir yaklaşım mümkün işlem işleme kodu ve diğer zaman alıcı kod eğer ayırmak olacaktır: Bu ise

from django.db import transaction 
from my_app.models import MyModel 

@transaction.commit_on_success 
def do_transaction(instances_to_save): 
    for inst in instances_to_save: 
     inst.save() 

def model_altering_method(): 
    instances_to_save = [] 
    for inst in MyModel.objects.all()[0:5000]: 
     inst.name = 'Joel Spolsky' 
     # Some models independent time consuming operations... 
     instances_to_save.append(inst) 
    do_transaction(instances_to_save) 

imkansız tasarım akıllı, mesela Yeni örnekler için yalnızca ilk kaydetme() işleminden sonra alabileceğiniz example.id bilgisine ihtiyacınız vardır, işlemi uzun süre açık tutmamak için akışınızı makul boyuttaki iş ünitelerine ayırmayı deneyin. Ayrıca, uzun işlemlerin her zaman kötü bir şey olmadığını da unutmayın. Uygulamanız db'yi değiştiren tek varlık ise, aslında tamam olabilir. Bununla birlikte, işlemler için zaman sınırını (veya boştaki işlemi) görmek için db'nizin özel yapılandırmasını kontrol etmelisiniz.

3

emin değilim, ama burada benim teorim - Ben senin commit_manually dekoratör yeni bir işlem başlayacak düşünürdüm İlk kaydınızı yaptığınızda yeni bir işlem yayına girmek yerine. Bu yüzden benim teorim, kod örneği B'nin işlemin daha uzun süre açık kalacağıdır, çünkü model listesinden iki kez geçmelidir. Yine, bu sadece bir teoridir - ve aynı zamanda, gerçek işlemin başladığında (başka bir teori) hangi DBMS'ye bağlı olduğunuza da bağlı olabilir.

+1

Çoğu durumda, bir işlemin verilerini hazırlamak uzun sürüyor. Söylediğiniz gibi, eğer dekore edilmiş blok başlar başlamaz işlem açılırsa, o zaman hazırlık bloklarını ve işlem bloklarını ayırmak için bir motivasyon var demektir. Bu durumda, işlemler bölümündeki django dokümantasyonunda belgelenmelidir. . – Jonathan

İlgili konular