0

当模型对象是许多其他对象的聚合时,无论是通过外键还是多对多,迭代该对象的查询集是否会导致对相关对象的单独查询?

可以说我有

class aggregateObj(models.Model):
  parentorg = models.ForeignKey(Parentorgs)
  contracts = models.ForeignKey(Contracts)
  plans = models.ForeignKey(Plans)

并执行

objs = aggregateObj.objects.all()

如果我遍历,或字段中objs进行的每个比较都会导致对该对象的单独查询吗?parentorgcontractsplan

4

2 回答 2

3

是的,默认情况下,每个比较都会创建一个单独的查询。为了解决这个问题,您可以使用select_related(并且prefetch_related关系在“向后”方向)QuerySet 方法来获取初始查询中的所有相关对象:

返回一个 QuerySet,它将自动“遵循”外键关系,在执行查询时选择附加的相关对象数据。这是一个性能提升器,它会导致(有时很多)更大的查询,但意味着以后使用外键关系不需要数据库查询。

于 2013-06-17T10:05:23.033 回答
1

是的。为防止这种情况,select_related请在查询时通过 JOIN 获取相关数据。

于 2013-06-17T10:05:39.707 回答