【问题标题】:Exclude a queryset from bigger queryset in django without hitting the database从 django 中更大的查询集中排除查询集而不访问数据库
【发布时间】:2017-03-02 19:35:38
【问题描述】:

我有一个模型所有对象的查询集。遍历对象,我正在删除列中具有重复值的更新行。因此,无需再次访问数据库,我想从更大的查询集中删除更新的行。

最有效的方法是什么?

【问题讨论】:

  • 最好让SQL过滤原始列表。它经过优化,可以比您更有效地执行 WHERE 子句。
  • 是的,实际上我在 SQL 中尝试过类似的事情,但这需要太多时间和 cpu 使用率。我不擅长 SQl :(
  • 时间太多?这会向我表明您的架构缺少索引。在 SQL 上运行 EXPLAIN PLAN 并查找表扫描。

标签: python django


【解决方案1】:

您可能需要提供有关您的特定用例的更多信息,但一般来说,Django 会将 QuerySet 的评估推迟到真正需要它们之前。如果您能够独立于较大的 QuerySet 构造排除集的 QuerySet,则可以调用 .exclude() 方法并生成一个大查询而不是两个较小的查询。例如:

excluded_set = Model.objects.filter(...)
large_set = Model.objects.filter().exclude(id__in=excluded_set)

【讨论】:

  • 不,我问的是在不打数据库的情况下这样做
  • 如果我错了,请纠正我,但排除,如过滤器,实际上并不评估查询集 - __in 查找会改变吗?我能找到的最好的(见绿色框):docs.djangoproject.com/en/1.10/ref/models/querysets/#in
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2017-08-12
  • 2021-02-07
  • 2015-10-08
  • 2019-07-01
  • 1970-01-01
  • 2016-08-09
相关资源
最近更新 更多