2012-07-30 42 views
6

我試圖清除,在我的Django模塊重裝表,的Django模型:objects.all()刪除()不

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

...跆拳道?總是魔術數字109.我知道我可以進入數據庫並手動刪除它們(或循環直到它們全部消失),但我很好奇。

+0

不知道,也許PuzzleSum的基礎QuerySet設置爲自定義管理器?例如https://docs.djangoproject.com/en/dev/topics/db/managers/#modifying-initial-manager-querysets – 2012-07-30 19:14:10

+0

好主意,但沒有。這是一個從django shell運行的數據加載腳本,並且(嘗試)刪除是我在導入模型後首先執行的操作。 – AlanL 2012-07-30 19:32:13

+0

您可以添加PuzzleSum和任何相關模型的代碼嗎? – 2012-07-30 20:11:41

回答

2

是的,Django將所有對象存儲在一個字典中,然後逐個刪除它們。這就是爲什麼只有獨特的項目被刪除,因爲它迭代它們。這是從Django的Collector類,它收集模型刪除:

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

然後:

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

只要你覆蓋你的模型的__hash__,存儲的模型時,在self.data字典中,只有唯一的存儲,然後刪除。

0

(在Mac OS X Lion的BTW Django的1.3.1)將我的評論上述成問題的答案:

我已經覆蓋,因爲的哈希EQ在PuzzleSum我想要使​​用的「重複」的特定定義。猜猜看:我有109個不同的散列值。 Django必須在其內部的刪除邏輯中使用一組對象。