我是否需要在django模板中优化数据库访问?

Rui*_*Xia 3 django django-templates django-views

说我有3个型号:

class Franchises
    name = models.CharField()

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

class Items
    store = models.ForeignKey(Stores)
    name = models.CharField()
Run Code Online (Sandbox Code Playgroud)

在视野中

items = Items.objects.all()
Run Code Online (Sandbox Code Playgroud)

在模板中

{% for item in items %}
  <div>item.store.franchise.name</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

jdi*_*jdi 6

django中的查询是懒惰的,这意味着他们尝试在访问之前尽可能少地解析.所以现在你将点击数据库作为store参考,然后再次franchise参考ref.这将是这些结果中的每个项目(许多查询).

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

Items.objects.selected_related('store__franchise').all()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)