2012-07-30 16 views
6

Ich versuche, einen Tisch in meinem django Modell zu löschen und neu zu laden, unddjango Modell:. Objects.All() löscht() nicht

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

... wtf? Immer die magische Zahl 109. Ich weiß, ich könnte einfach in die Datenbank gehen und sie manuell löschen (oder Schleife, bis sie alle weg sind), aber ich bin neugierig.

(Django 1.3.1 auf Mac OS X Lion btw)

+0

nicht, vielleicht PuzzleSum Basis QuerySet wurde auf einen benutzerdefinierten Manager gesetzt? z.B. https://docs.djangoproject.com/de/dev/topics/db/managers/#modifying-initial-manager-querysets –

+0

Gute Idee, aber nein. Es ist ein Datenladeskript, das von einer django-Shell ausgeführt wird, und das (versuchte) Löschen ist das erste, was ich nach dem Import der Modelle mache. – AlanL

+0

Könnten Sie den Code für PuzzleSum und ähnliche Modelle hinzufügen? –

Antwort

2

Ja, Django speichert alle Objekte in einem Diktat und löscht sie dann einzeln. Das ist der Grund, warum nur die einzigartigen Objekte gelöscht werden, wenn sie über sie iteriert werden. Dies ist aus der Django Collector-Klasse, die die Modelle zum Löschen sammelt:

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

und dann:

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

Solange Sie die __hash__ Ihrer Modelle außer Kraft gesetzt haben, wenn die Modelle gespeichert sind im self.data-dict werden nur die eindeutigen gespeichert und dann gelöscht.

0

Konvertieren von meinem Kommentar oben in eine Antwort auf die Frage:

I Hash und eq in PuzzleSum außer Kraft gesetzt haben, weil ein bestimmte Definition von "Duplikat", die ich verwenden möchte. Und rate mal: Ich habe 109 verschiedene Hashwerte. Django muss eine Reihe von Objekten irgendwo innerhalb seiner Löschlogik verwenden.