django model:objects.all()。delete()不是

时间:2012-07-30 18:53:30

标签: django django-models

我正在尝试清除并重新加载我的django模型中的表格,

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

... wtf?总是神奇的数字109.我知道我可以直接进入数据库并手动删除它们(或循环直到它们全部消失)但我很好奇。

(Mac OS X Lion btw上的Django 1.3.1)

2 个答案:

答案 0 :(得分:4)

是的,Django将所有对象存储在dict中,然后逐个删除它们。这就是为什么只删除唯一的项目,因为它迭代它们。这是来自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 dict中时,只存储唯一的模型,然后将其删除。

答案 1 :(得分:2)

将上述评论转换为问题的答案:

我在PuzzleSum中覆盖了哈希 eq ,因为我想要使用“重复”的特定定义。猜猜看:我有109个不同的哈希值。 Django必须在其删除逻辑内部的某处使用一组对象。