首页 > 解决方案 > 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 处理查询。是否不需要重构,还是我在模板中进行查询违反了最佳实践?

标签: djangodjango-templates

解决方案


是的,这是一种不好的做法,原因如下:

  • 模板旨在在解析变量时消除任何错误。出于这个原因,如果它在将引发错误并且可以处理的视图中,则调试诸如查询之类的复杂事物要容易得多。
  • .all你突然需要做而不是做时会发生什么.filter(attribute=value)。现在你不能再这样做了,你必须把它移回视图。首先将查询放在视图中会更好。(是的,有一些方法可以绕过这个例子,但也会有一些情况下没有。它会让你的生活变得更容易在视图中开始查询)。
  • 模板中的查询会降低该模板的可重用性。
  • 只是从一般的编程原则。分离关注点很好。一个地方真的应该只做一件事。这样更简单。模板应该只是关于渲染数据。不获取数据。

推荐阅读