说我有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是否会命中数据库?以及我需要做些什么来优化数据库访问?
答案 0 :(得分:6)
django中的查询是懒惰的,这意味着他们尝试在访问之前尽可能少地解析。所以现在你将点击store
引用的数据库,然后再点击franchise
引用。这将是这些结果中的每个项目(许多查询)。
如果您知道需要这些关系,可以告诉查询立即获取它们:
Items.objects.selected_related('store__franchise').all()
Django会提前进行连接,以确保每个结果都已缓存到那些相关对象。当你点击它们时,它不会触发更多的查询。
的更多信息测试这个的一个非常酷的方法是启动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