django - 我需要优化 Django 模板中的数据库访问吗?

标签 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()

可见

items = Items.objects.all()

在模板中

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

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

最佳答案

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

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

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

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

有关 select_related here 的更多信息

一个非常酷的测试方法是启动 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

关于django - 我需要优化 Django 模板中的数据库访问吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11996415/

相关文章:

python - 渲染而不传递请求

django - 从 Django UpdateView 中的 URL 返回 PK

python - 使用 anaconda 发行版进行 Web 开发可以吗?

django - 在 django 模板中遇到 user.is_authenticated 问题

javascript - 下拉菜单不创建 Javascript

python - 从亚马逊库存中提取产品/价格/类别/规范

django - 在具有基于类的 View 的模板中显示外键

python - 将链接列表传递给 Django 模板

django - 使用 ListCreateAPIView 和 ListSerializer 进行批量创建

python - 如何从 FilteredSelectMultiple 小部件接收用户输入?