Django中具有外键的查询集的行为

时间:2013-06-17 09:56:50

标签: django django-models django-queryset

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

让我说我有

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

并执行

objs = aggregateObj.objects.all()

如果我迭代objs,那么在parentorgcontractsplan字段内进行的每次比较都会导致对该对象的单独查询吗?

2 个答案:

答案 0 :(得分:3)

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

  

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

答案 1 :(得分:1)

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