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

阿尔巴兹·侯赛因
class A(models.Model)
  results = models.TextField()
class B(models.Model)
  name = models.CharField(max_length=20)
  res = models.ManyToManyField(A)
  • 假设我们有以上两个模型。A模型有数百万个对象。

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

  • 假设我们必须检索对象编号5为的所有结果B
Option 1 :  A.objects.filter(b__id=5)

   (OR)

Option 2 : B.objects.get(id=5).res.all()
  • 选项1:我的问题是在A模型对象上按ID过滤会花费很多时间吗?因为有数以百万计的A模型对象。
  • 选项2:问题:模型上的res字段是否B存储模型对象idA

我之所以选择该选项2,是因为它存储了A模型对象的引用并直接直接获取那些对象值,然后进行第二次查询以获取结果,因此是一种更快的方法而在第一个选项中,按ID或任何其他字段进行过滤将占用大量时间

威廉·范昂塞姆

一个表达式将导致一个数据库查询。确实,它将查询:

SELECT a.*
FROM a
INNER JOIN a_b ON a_b.a_id = a.id
WHERE a_b.b_id = 5

所述第二表达将导致2个查询。确实,首先Django将通过以下查询进行查询以获取该特定B对象:

SELECT b.*
FROM b
WHERE b.id = 5

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

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

我的问题是在模型对象上按id过滤会花费很多时间吗?因为有数以百万计的A模型对象。

数据库通常在外键字段上存储索引。因此,这意味着它将有效过滤。A对象的总数通常不相关(因为它使用像B树[wiki]这样的数据结构来加速搜索)。Wiki页面上有一个名为“索引加快搜索速度”的部分,它解释了该过程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django Q对象和M2M查询

来自分类Dev

Django Q对象和M2M查询

来自分类Dev

Django删除主对象删除上的所有M2M相关对象

来自分类Dev

Django遍历所有M2M关系

来自分类Dev

MongoDB执行此查询的最有效方法

来自分类Dev

创建Django查询集快照的最有效方法?

来自分类Dev

Django从m2m到模型按字段注释查询集

来自分类Dev

Django,如何在没有M2M的模型中拥有数组?

来自分类Dev

如何使用 commit=False 在 Django 上保存 m2m 字段?

来自分类Dev

保存在具有外国和 M2M 关系的模型上

来自分类Dev

有没有更有效的方法来执行此嵌套SQL查询?

来自分类Dev

Django ORM-带有M2M的加速筛选器

来自分类Dev

Python Django:对具有m2m字段和mySql的单个模型使用dumpdata

来自分类Dev

Django的“ ModelForm”对象通过M2M没有属性“ cleaned_data”

来自分类Dev

具有m2m和中间(直通)模型的Django查找

来自分类Dev

Django:如何有效查询关系

来自分类Dev

与Django在m2m关系中获取_set.all()值的更快方法

来自分类Dev

Django m2m 字段删除方法不起作用

来自分类Dev

django表2访问m2m

来自分类Dev

对图像执行积分的有效方法

来自分类Dev

编写此查询的有效方法

来自分类Dev

查询相似句子的有效方法

来自分类Dev

Django 1.6 AbstractUser M2M模型验证错误

来自分类Dev

Django过滤确切的M2M对象

来自分类Dev

Django:删除对象中的M2M关系

来自分类Dev

Django:在信号中获取与M2M相关的对象

来自分类Dev

使用Django的ORM进行复杂的M2M过滤

来自分类Dev

模型表单中的Django M2M字段?

来自分类Dev

通过模型对象遍历Django M2M