通过外键关系访问相关模型实例时,django何时查询数据库?

时间:2020-07-09 13:53:29

标签: django django-models

这是示例模型定义:

class Glass(model):
    type = models.CharField(max_length=255)

class Window(model):
    glass = models.ForeignKey(Glass)

class House(model)
    window = models.ForeignKey(Window)

不遍历提到的模型的外键并获取相关对象。

house = House.objects.get(pk=1)
window = house.window
glass= house.window.glass

我知道要获取house,需要运行查询。然后,当我得到house.window时,我想运行第二个查询来获取窗口的实例。当访问glass时,Django是否已经在window的实例中加载了House?还是再次查询窗口?

我似乎无法在线或在Django文档中找到此问题的确切答案。

答案将有助于我进一步理解Django ORM查询。

干杯!

1 个答案:

答案 0 :(得分:0)

每次触发orm进行查询时,第一行都会创建一个house实例,并向其加载数据,第二行也是如此,但window实例和第三行玻璃实例的行。您可以通过在第一个查询中添加 prefetch_related 作为参数来合并这些查询。如果您不希望第二和/或第三查询,则可以使用 house.window_id 直接访问id字段(通过直接访问属性来绕过orm)。如果确实使用 house.window.id ,则会触发orm创建窗口实例。