2012-07-30 18 views
6

que estoy tratando de limpiar y volver a cargar una tabla en mi modelo de Django, yDjango modelo. Objects.All() borrar() no

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

... wtf? Siempre el número mágico 109. Sé que podría ir a la base de datos y eliminarlos a mano (o en bucle hasta que todos se hayan ido), pero tengo curiosidad.

(Django 1.3.1 en Mac OS X Lion por cierto)

+0

dunno, tal vez la base de PuzzleSum ¿QuerySet tiene configurado un administrador personalizado? p.ej. https://docs.djangoproject.com/en/dev/topics/db/managers/#modifying-initial-manager-querysets –

+0

Buena idea, pero no. Es una secuencia de comandos de carga de datos que se ejecuta desde un shell django, y la eliminación (intentada) es lo primero que hago después de importar los modelos. – AlanL

+0

¿Podría agregar el código para PuzzleSum y cualquier modelo relacionado? –

Respuesta

2

Sí, Django está almacenando todos los objetos en un dict, y luego los borra uno por uno. Esa es la razón por la que solo se eliminan los elementos únicos, ya que itera sobre ellos. Esto es de la clase de Django Collector, que recoge los modelos para su eliminación:

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

y luego:

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

Mientras usted ha redefinido la __hash__ de sus modelos, cuando se almacenan los modelos en el dict de autodata, solo los únicos se almacenan y luego se eliminan.

0

la conversión de mi comentario anterior en una respuesta a la pregunta: ¿

He anulado de hash y eq en PuzzleSum debido a una definición particular de "duplicado" que quiero usar. Y adivina qué: tengo 109 valores de hash distintos. Django debe estar usando un conjunto de objetos en algún lugar interno en su lógica de eliminación.