django - Django:从模板中进行查询是否合适?
问题描述
我有两个模型,书籍和章节:
class Book(models.Model):
title = models.CharField(max_length = 200)
class Chapter(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name="chapter_set")
index = models.IntegerField()
在我的模板中,我展示了每本书和后续章节索引:
{% for book in books %}
<h2>{{ book.title }}</h2>
<br>
{% for chapter in book.chapter_set.all %}
<p>{{ chapter.index }}</p>
{% endfor %}
{% endfor %}
这段代码工作正常。但是,我反复听到将逻辑放置在可以放置在视图或模型中的模板中是一个坏主意。如果我妨碍性能,我会犹豫是否从我的模板中实现这么多查询。
我正在考虑重构此代码,以便模板不会通过related_name 处理查询。是否不需要重构,还是我在模板中进行查询违反了最佳实践?
解决方案
是的,这是一种不好的做法,原因如下:
- 模板旨在在解析变量时消除任何错误。出于这个原因,如果它在将引发错误并且可以处理的视图中,则调试诸如查询之类的复杂事物要容易得多。
- 当
.all
你突然需要做而不是做时会发生什么.filter(attribute=value)
。现在你不能再这样做了,你必须把它移回视图。首先将查询放在视图中会更好。(是的,有一些方法可以绕过这个例子,但也会有一些情况下没有。它会让你的生活变得更容易在视图中开始查询)。 - 模板中的查询会降低该模板的可重用性。
- 只是从一般的编程原则。分离关注点很好。一个地方真的应该只做一件事。这样更简单。模板应该只是关于渲染数据。不获取数据。
推荐阅读
- java - 为什么 javac 会创建大量 .class 文件?
- python - 无法使用 pip 安装某些 python 包
- java - 错误 DOMException:无法在“XMLHttpRequest”上执行“打开”:无效的 URL
- android - 是否可以更改 android 内置的 midi 播放器弯音范围?
- react-native - 如何在 rxjs 6 中订阅多个 observable?do 不是 rxjs 6 中的函数
- postgresql - PostgreSQL:只允许用户执行程序,但避免访问任何其他资源,例如表?
- azure - ASP.NET Core 身份、Azure SQL 数据库备份和 GDPR 数据删除请求
- c++ - 如何理解cout的默认格式
- assembly - 带有 YMM 寄存器的 AVX 中的 STRLEN 函数说明
- python - 学习熊猫数据框的预期输出