2013-05-09 20 views
7

içindeki nesneleri silerken Django QuerySet üzerinde yineleme Queryset içindeki nesneleri silerken Django QuerySet üzerinde yineleme yapmanın en iyi yolunun ne olduğunu merak ediyorum? Örneğin, belirli zamanlarda girişleri olan bir günlük tablonuz olduğunu ve bunları her 5 dakikada bir en fazla 1 giriş olacak şekilde arşivlemek istediğinizi varsayalım. Bunun yanlış olabilir biliyorum ama bu benim için gidiyorum ne tür:Aynı QuerySet

toarchive = Log.objects.all().order_by("-date") 
start = toarchive[0].date 
interval = start - datetime.timedelta(minutes=5) 
for entry in toarchive[1:]:   
    if entry.date > interval: 
     entry.delete() 
    else: 
     interval = entry.date - datetime.timedelta(minutes=5) 
+3

Bu geçerli, nesneleri bu şekilde silebilirsiniz. – Rohan

+0

Böyle queryset üzerinde döngü yaparken delete() kullanarak modelin yönetici sayfasına gittiğimde boş bir reccord tutun. Nesne tamamen silinmiş gibi görünüyor. Sorun nedir? –

cevap

0

Sorgu kümelerini o sorgu kümesi tüm sonuçlarını silecektir delete yöntemi var. Örnek için

toarchive.filter(date__gt=interval).delete() 

çalışacaktır. Bununla birlikte, bir filtrede yapılamayan bir test yapıyorsanız, anlattığınız yöntem muhtemelen en iyisidir.

+0

Cevabınız için teşekkürler! Bu yöntemin de mümkün olduğunu biliyorum. Ancak bu durumda, bunun işe yaramayacağını düşünmüyorum çünkü silme koşulu QuerySet'teki girişler arasında göreceli. Ben daha genel olarak bilmek istediğimi sanırım, ben onun üzerinden yineleme sırasında QuerySet gelen nesneleri silme, ben sorunları içine girer. – user1630866

+0

Haklısın, “else” maddesine dikkat etmedim. Bunu test etmedim, ancak bir QuerySet içindeki nesneleri silmek güvenli olmalı, çünkü 'delete' sadece SQL delete sorgusunu yayınlıyor, bellekteki model nesnesini etkilemiyor. – Will

+0

bu veritabanı girişini yok edecek mi? ya da sadece sorgudan çıkarmak? – jeff

3

Sanırım başka biri merak ediyorsa, kendi sorumu soruyorum. Nesneleri silerken, bir şeyleri silerken bir problem olacağını düşündüm ama yok. Sorudaki kod pasajı, bunu yapmanın doğru yolu.

+1

Filtre işlemini gerçekleştirdikten sonra nesneyi silmek yerine, sorgu kümesindeki öğeyi nasıl kaldırabilirim? –