社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

在一个查询集上多次获取或筛选id__,在django中哪个更有效?

Tanvir Ahmed • 4 年前 • 1990 次点击  

以下哪项在django中更有效 ids 不是很大,而且 queryset 可能太大了?

items = [item for item in queryset.filter(id__in=ids)]
items = [queryset.get(id=id) for id in ids]

注:我们保证不会有这样的id不匹配。此外,在某些情况下,ID的长度可能为1

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132225
文章 [ 2 ]  |  最新文章 4 年前
moshfiqrony
Reply   •   1 楼
moshfiqrony    4 年前

如果我们想衡量效率,那么我们必须首先考虑查询。因为两者都在做列表理解,而我们与之无关。

现在如果我们来到 queryset.filter 和 queryset.get 并尝试理解等效的SQL查询。

  • SQL查询计数:用于 filter 只有一个查询,但对于 get 会有的 n 查询次数。即使 N 是2, 滤器 它的效率比 收到 .
  • 执行效率:这个也依赖于SQL查询。因为作为 收到 实现称它将创建查询并每次执行。但是 滤器 将创建一个查询并执行一次。跨国执行(对数据库进行查询)总是比在代码中执行慢。

您可以看到 queryset。滤器 通过打印 query 它的属性。

我想 滤器 它的效率比 收到 在这种情况下。

Willem Van Onsem
Reply   •   2 楼
Willem Van Onsem    4 年前

使用 .filter(…) 将更有效率:这将执行 一 查询数据库,而解决方案 .get(…) 将运行 N 对数据库的查询,以及 N 中的元素数 ids .

而 .filter(过滤) 查询可能需要更长的时间,构造查询、将查询发送到数据库、解码查询、构造执行计划,以及将结果发送回都将使用一次 .filter(过滤) ,而 .得到 解决方案,这将完成 N 时报。

请注意,这两者在语义上是不等价的: .filter(过滤) 将检索 id 存在,存在 .得到 另一方面,如果找不到id,解决方案将出错。

如果要退货的物品数量很大,你应该 不 将这些存储在列表中,但使用 .iterator(…) [Django-doc] 要成批处理项目,请执行以下操作:

for item in queryset.filter(id__in=ids).iterator():
    # do something …

如果将这些项存储在一个列表中,这将无法实现迭代器的目的,因为所有对象都同时处于“活动”状态,因此应该有足够的内存将它们保存在内存中。