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的最佳有效/最快方法是什么。
假设我们必须检索B的对象号5的所有结果
Option 1 : A.objects.filter(b__id=5)
(OR)
Option 2 : B.objects.get(id=5).res.all()A模型对象进行过滤会花费大量时间吗?由于有数百万的objects.B模型上的res字段是否存储A模型对象的id值?我假定选项2的原因是一种更快的方法,因为它存储A模型对象的引用&首先直接获取这些对象值,然后进行第二个查询来获取结果。而在第一个选项中,通过id或任何其他字段进行过滤将占用大量时间。
发布于 2020-01-04 18:08:09
第一个表达式将导致one数据库查询。实际上,它将查询:
SELECT a.*
FROM a
INNER JOIN a_b ON a_b.a_id = a.id
WHERE a_b.b_id = 5第二个表达式将导致两个查询。实际上,第一个Django将使用如下的查询来查询以获取特定的B对象:
SELECT b.*
FROM b
WHERE b.id = 5然后,它将进行完全相同的查询来检索相关的A对象。
但是这里没有必要检索A对象(当然,除非您在其他地方需要它)。因此,您可以进行无用的数据库查询。
我的问题是用id过滤模型对象会花费很多时间吗?因为有上百万的模型物体。
数据库通常在外键字段上存储索引。因此,这意味着它将有效地过滤。A对象的总数通常与此无关(因为它使用数据结构来像 [wiki]一样加速搜索)。wiki页面有一个named 部分,它解释了这是如何工作的。
https://stackoverflow.com/questions/59593444
复制相似问题