姜戈。这两个查询是否相同?

Django. Are these two queries the same?

首先。我不确定如何写这个问题,所以它对 SO 用户更有用,也许有人可以编辑这个问题。

所以,我有这两个模型:

class A(models.Model):
    ...

class B(models.Model):
   foreign = models.Foreignkey(A)
   aproperty = models.CharField(...)

我在一个视图中有这两种可能的查询:

b_objs = B.objects.filter(aproperty=value)
a_objs = [b.foreign for b in b_objs]

or

a_objs = A.objects.filter(b__aproperty=value)

它们一样贵吗?

不仅"not equally expensive",而且结果也不一样。

第一种方法:直接在 B 上查询,然后通过在 b_objs 上循环获取所有 foreign。结果是一个列表。

第二种方法:你在underline实现中做了一个数据库join操作,然后获取结果。结果是一个查询集。

显然第二种方法更有效,因为您只需加入数据库一次即可获取结果,而第一种方法需要多次访问数据库才能获得 A 个对象。