3

假设我有 3 个模型:

class Franchises
    name = models.CharField()

class Stores
    franchise = models.ForeignKey(Franchises)
    name = models.CharField()

class Items
    store = models.ForeignKey(Stores)
    name = models.CharField()

在视野中

items = Items.objects.all()

在模板中

{% for item in items %}
  <div>item.store.franchise.name</div>
{% endfor %}

我想知道执行 item.store.franchise.name 是否会命中数据库?我需要做什么来优化数据库访问?

4

1 回答 1

6

django 中的查询是惰性的,这意味着它们会尝试尽可能少地解析,直到被访问。因此,现在您将访问数据库以获取store参考,然后再次访问franchise参考。这将适用于这些结果中的每个项目(许多查询)。

如果您知道您将需要这些关系,您可以告诉查询立即获取它们:

Items.objects.selected_related('store__franchise').all()

Django 将提前进行连接,以确保每个结果都已为这些相关对象缓存。当您点击它们时,它不会触发更多查询。

有关 select_related 的更多信息在这里

一个非常酷的测试方法是启动 django shell ./manage.py shell,然后查看发出的查询:

from django import db
from django.db import connection

db.reset_queries()

items = list(Items.objects.all())
print connection.queries

db.reset_queries()

items = list(Items.objects.selected_related('store__franchise').all())
print connection.queries
于 2012-08-16T22:38:11.613 回答