首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在M2M上执行查询的有效方法

在M2M上执行查询的有效方法
EN

Stack Overflow用户
提问于 2020-01-04 18:03:24
回答 1查看 45关注 0票数 1
代码语言:javascript
复制
class A(models.Model)
  results = models.TextField()
代码语言:javascript
复制
class B(models.Model)
  name = models.CharField(max_length=20)
  res = models.ManyToManyField(A)

假设我们有两个以上的模型。A模型有数百万个对象。

我想知道获得特定results objects对象的所有B的最佳有效/最快方法是什么。

假设我们必须检索B的对象号5的所有结果

代码语言:javascript
复制
Option 1 :  A.objects.filter(b__id=5)

   (OR)

Option 2 : B.objects.get(id=5).res.all()

  • 选项1:我的问题是通过id对A模型对象进行过滤会花费大量时间吗?由于有数百万的objects.
  • Option 2模型:问题:B模型上的res字段是否存储A模型对象的id值?

我假定选项2的原因是一种更快的方法,因为它存储A模型对象的引用&首先直接获取这些对象值,然后进行第二个查询来获取结果。而在第一个选项中,通过id或任何其他字段进行过滤将占用大量时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-04 18:08:09

第一个表达式将导致one数据库查询。实际上,它将查询:

代码语言:javascript
复制
SELECT a.*
FROM a
INNER JOIN a_b ON a_b.a_id = a.id
WHERE a_b.b_id = 5

第二个表达式将导致两个查询。实际上,第一个Django将使用如下的查询来查询以获取特定的B对象:

代码语言:javascript
复制
SELECT b.*
FROM b
WHERE b.id = 5

然后,它将进行完全相同的查询来检索相关的A对象。

但是这里没有必要检索A对象(当然,除非您在其他地方需要它)。因此,您可以进行无用的数据库查询。

我的问题是用id过滤模型对象会花费很多时间吗?因为有上百万的模型物体。

数据库通常在外键字段上存储索引。因此,这意味着它将有效地过滤。A对象的总数通常与此无关(因为它使用数据结构来像 [wiki]一样加速搜索)。wiki页面有一个named 部分,它解释了这是如何工作的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59593444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档