2012-07-30 13 views
6

yapar veDjango modeli:. Objects.all() silin() Ben temizlemek ve benim Django modelinde bir tablo yeniden çalışıyorum değil

>>> models.PuzzleSum.objects.all().count() 
2644 
>>> models.PuzzleSum.objects.all().delete() 
>>> models.PuzzleSum.objects.all().count() 
2535 

... wtf? Her zaman sihirli numara 109. Veritabanına girip onları el ile silebileceğimi biliyorum (ya da hepsi gidene kadar döngü) ama merak ediyorum. Çünkü a PuzzleSum içinde karma ve eq geçersiz kıldık

: Sorunuzun cevabını yukarıdaki yorumumu dönüştürme

+0

dunno, belki PuzzleSum'un üssü QuerySet özel bir yöneticiye ayarlandı mı? Örneğin. https://docs.djangoproject.com/en/dev/topics/db/managers/#modifying-initial-manager-querysets –

+0

İyi fikir, ama hayır. Bu, bir django kabuğundan çalışan bir veri yükleme komut dosyasıdır ve (girişimi) silme, modelleri içe aktardıktan sonra yaptığım ilk şeydir. – AlanL

+0

PuzzleSum ve ilgili modellerin kodunu ekleyebilir misiniz? –

cevap

2

Evet, Django tüm nesneleri bir dict içinde saklıyor ve sonra bunları tek tek siler. Bu, yalnızca benzersiz öğelerin, bunların üzerinde yinelenen neden silinir nedeni budur. Modeller saklandığı zaman Sürece modellerinin __hash__ geçersiz kıldık olarak

# delete instances 
for model, instances in self.data.iteritems(): 
    query = sql.DeleteQuery(model) 
    pk_list = [obj.pk for obj in instances] 
    query.delete_batch(pk_list, self.using) 

,: o zaman

self.data = SortedDict([(model, self.data[model]) 
         for model in sorted_models]) 

ve: Bu silinmek üzere modellerini toplayan Django Collector sınıfından olan self.data'da, sadece benzersiz olanlar saklanır ve silinir.

0

(Btw, Mac OS X Lion Django 1.3.1) Kullanmak istediğim "duplicate" özel tanımı. Ve bil bakalım: 109 farklı karma değerlerim var. Django, silme mantığında dahili bir yerde bir dizi nesne kullanmalıdır.

İlgili konular