【问题标题】:django model: objects.all().delete() doesn'tdjango 模型:objects.all().delete() 没有
【发布时间】:2012-07-30 18:53:30
【问题描述】:

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

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

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

(顺便说一句,Mac OS X Lion 上的 Django 1.3.1)

【问题讨论】:

  • 不知道,也许 PuzzleSum 的基本 QuerySet 设置为自定义管理器?例如docs.djangoproject.com/en/dev/topics/db/managers/…
  • 好主意,但不行。这是一个从 django shell 运行的数据加载脚本,(尝试)删除是我在导入模型后做的第一件事。
  • 您能添加 PuzzleSum 和任何相关模型的代码吗?
  • 你的模型是如何进入模型的? models.PuzzleSum.objects.all()?您的模型应该是 django.db.models.Model 的“子类”?是吗?
  • 知道了!是的,我的模型是 models.Model 的子类,但我已经覆盖了 hasheq,因为我想使用“重复”的特定定义。猜猜看:我有 109 个不同的哈希值。 Django 必须在其删除逻辑的内部某处使用一组对象。

标签: django django-models


【解决方案1】:

是的,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 字典中时,只会存储唯一的模型,然后将其删除。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-15
      • 2010-12-01
      • 2020-09-29
      • 2020-04-30
      • 2018-12-01
      • 2018-12-09
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多