2012-03-15 23 views
5

adresinde değiştirme Değişken olarak bunu yapabilir miyim veya yapmalı mıyım?Bir QuerySet nesnesini Django

a = SomeTable.objects.all() 
for r in a: 
    if r.some_column == 'foo': 
     r.some_column = 'bar' 

O bir şampiyon gibi çalıştı, ama başka bir yerde benzer bir şey denedim ve QuerySet nesneleri hafife olmak sevmiyorum ima garip sonuç vermeye başlamıştı. Ve bu tür bir hile için dokümanlardaki hiçbir şeyi iyi veya kötü görmedim.

Bunu yapmanın başka yolları olduğunu biliyorum, ancak özellikle bunun kötü bir fikir olup olmadığını, niçin kötü olduğunu ve gerçekten kötüyse, en iyi 'django/pythonic yolunun ne olduğunu bilmek istiyorum. anında değerleri değiştirmek için olurdu.

cevap

6

Bu, daha sonra herhangi bir şey yapmadığınız sürece sorun olur, bu da queryset'in yeniden değerlendirilmesine neden olur - örneğin, dilimleme. Bu, veritabanına başka bir sorgu yapar ve değiştirilen tüm nesnelerin yerine yenileri konur.

ilk listeye dönüştürmek olacaktır karşı kendinizi korumak için bir yol:

a = list(SomeTable.objects.all()) 

Bu şekilde, daha fazla dilimleme vb taze bir db çağrıyı neden olmaz ve herhangi bir değişikliğin korunacaktır.

+0

Teşekkürler, Daniel. Örneğiniz, "Bunu yapmanın başka yolları olduğunu biliyorum" dediğimde tam olarak kastettiğim şeydir ve ben de açıklamanızı takdir ediyorum. Oh, ve bir dilim alma örneğiniz, bahsettiğim garip sonuçlara neden olan şeydi. Biraz utandım, yakalamadım ve işaret ettiğine sevindim. Şerefe! – proffrink

0

Yup. docs here

SomeTable.objects.filter(some_column='foo').update(some_column='bar') 

Ben Django'nın deyim ile gider bakın. SQL, kodunuz gibi çoklu SQL ifadelerini göndermek yerine 'nerede' ve 'güncellemeyle' tek bir deyim ile yürütür. Bu zaman kazandırır. SQL süresini test etmek için Django'nun 'connection' ile kontrol edin.

+4

Teşekkürler, ve ben olmasaydım özür dilerim, ancak veritabanını güncellemekle ilgilenmiyorum, sadece görüntüleme amaçları için çıktıyı değiştiriyorum. – proffrink

İlgili konular