Django 德扬戈。这两个查询是否相同?

Django 德扬戈。这两个查询是否相同?,django,django-queryset,Django,Django Queryset,首先。我不知道如何写这个问题,这样对用户更有用,也许有人可以编辑这个问题 因此,我有两种模型: 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.for

首先。我不知道如何写这个问题,这样对用户更有用,也许有人可以编辑这个问题

因此,我有两种模型:

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)
它们同样昂贵吗?

它们不仅“不一样昂贵”,而且结果也不同

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

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

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

它们不仅“成本不一样”,而且结果也不同

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

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

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

它们不仅“成本不一样”,而且结果也不同

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

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

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

它们不仅“成本不一样”,而且结果也不同

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

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



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

您可以使用
B.obejcts.filter(aproperty=value)。选择_related('foreign')
将其简化为一个数据库查询,尽管没有任何其他假设,我还是会选择第二种方法。也许你应该明确地说,在第一种方法中,你将访问数据库中
b_objs
中的所有对象。要获取每个
a
a,将使用一个select。@schillingt多次尝试了
select\u相关的
查询,但都不起作用。@alejoss:什么不起作用?你能详细描述一下吗?Django doc:@schillingt nevermind,感谢您发表的
select\u相关
评论。我认为select_related将使用对象填充查询。它用已经包含相关A对象的B对象填充它。您可以使用
B.obejcts.filter(aproperty=value)。选择_related('foreign')
将其简化为一个数据库查询,尽管没有任何其他假设,我仍然会使用第二种方法。也许你应该明确地说,在第一种方法中,你将使用
b_objs
中的对象来访问数据库。要获取每个
a
a,将使用一个select。@schillingt多次尝试了
select\u相关的
查询,但都不起作用。@alejoss:什么不起作用?你能详细描述一下吗?Django doc:@schillingt nevermind,感谢您发表的
select\u相关
评论。我认为select_related将使用对象填充查询。它用已经包含相关A对象的B对象填充它。您可以使用
B.obejcts.filter(aproperty=value)。选择_related('foreign')
将其简化为一个数据库查询,尽管没有任何其他假设,我仍然会使用第二种方法。也许你应该明确地说,在第一种方法中,你将使用
b_objs
中的对象来访问数据库。要获取每个
a
a,将使用一个select。@schillingt多次尝试了
select\u相关的
查询,但都不起作用。@alejoss:什么不起作用?你能详细描述一下吗?Django doc:@schillingt nevermind,感谢您发表的
select\u相关
评论。我认为select_related将使用对象填充查询。它用已经包含相关A对象的B对象填充它。您可以使用
B.obejcts.filter(aproperty=value)。选择_related('foreign')
将其简化为一个数据库查询,尽管没有任何其他假设,我仍然会使用第二种方法。也许你应该明确地说,在第一种方法中,你将使用
b_objs
中的对象来访问数据库。要获取每个
a
a,将使用一个select。@schillingt多次尝试了
select\u相关的
查询,但都不起作用。@alejoss:什么不起作用?你能详细描述一下吗?Django doc:@schillingt nevermind,感谢您发表的
select\u相关
评论。我认为select_related将使用对象填充查询。它用已经包含相关A对象的B对象填充它。