2012-07-30 17 views
6

Próbuję usunąć i przeładować stolik w moim modelu django idjango model:. Objects.All() delete() nie

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

... wtf? Zawsze magiczna liczba 109. Wiem, że mogłem po prostu wejść do bazy danych i usunąć je ręcznie (lub pętlę, dopóki wszystkie nie znikną), ale jestem ciekawy.

(Django 1.3.1 na Mac OS X Lion btw)

+0

dunno, może baza danych PuzzleSum's QuerySet została ustawiona na niestandardowego menedżera? na przykład https://docs.djangoproject.com/en/dev/topics/db/managers/#modifying-initial-manager-querysets –

+0

Dobry pomysł, ale nie. Jest to skrypt ładowania danych uruchamiany z powłoki django, a (próba) usunięcia jest pierwszą rzeczą, którą robię po zaimportowaniu modeli. – AlanL

+0

Czy możesz dodać kod do PuzzleSum i wszelkich powiązanych modeli? –

Odpowiedz

2

Tak, Django przechowuje wszystkie obiekty w dykcie, a następnie usuwa je pojedynczo. Z tego powodu tylko unikatowe elementy są usuwane, ponieważ iteruje nad nimi. To jest z klasą Django Collector, który zbiera modele do usunięcia:

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

a następnie:

# 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) 

Dopóki masz nadpisane na __hash__ swoich modeli, gdy są przechowywane modele w dykcie self.data zapisywane są tylko te niepowtarzalne, a następnie usuwane.

0

Konwersja mój komentarz powyżej w odpowiedzi na pytanie:

mam zamienione na hash i eq w PuzzleSum powodu konkretna definicja "duplikatu", z którego chcę skorzystać. I zgadnij co: Mam 109 różnych wartości hash. Django musi używać zestawu obiektów gdzieś wewnątrz swojej logiki kasowania.