当模型对象是许多其他对象的聚合时,无论是通过外键还是多对多,迭代该对象的查询集会导致对相关对象的单独查询?
让我说我有
class aggregateObj(models.Model):
parentorg = models.ForeignKey(Parentorgs)
contracts = models.ForeignKey(Contracts)
plans = models.ForeignKey(Plans)
并执行
objs = aggregateObj.objects.all()
如果我迭代objs
,那么在parentorg
,contracts
或plan
字段内进行的每次比较都会导致对该对象的单独查询吗?
答案 0 :(得分:3)
是的,默认情况下,每次比较都会创建一个单独的查询。为了解决这个问题,您可以使用select_related
(和prefetch_related
关系处于'向后'方向)QuerySet方法来获取初始查询中的所有相关对象:
返回一个QuerySet,它将自动“跟随”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致(有时很多)更大的查询,但意味着以后使用外键关系不需要数据库查询。
答案 1 :(得分:1)
是。为防止这种情况,请在查询时使用select_related
通过JOIN获取相关数据。