【发布时间】:2022-07-26 13:10:53
【问题描述】:
向 Django QuerySet 追加或注入一些额外数据的最佳方法是什么?
想象一下我正在显示Books 列表的情况,我想显示对每个列表进行特殊计算的结果:
models.py
class Book(models.Model):
name = models.CharField(max_length=64)
book_list.html
{% for book in objects %}
{{ book.name }} - {{ book.special_result }}
{% endfor %}
views.py
class BookListView(ListView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
books = self.object_list
for book in books:
book.special_result = do_special_calculation(foo=bar)
context['books'] = books
return context
假设do_special_calculation()方法不能在模板中计算,也不能作为模型参数,因为它需要传入一个变量foo。
此代码没有达到使每个book 的special_result 值可从模板访问的预期结果,因为for 循环的每次迭代都会覆盖book 变量。我提出的每个解决方案基本上都涉及构建一个与 QuerySet 并行的新字典,将其传递到模板中,并同时在模板中循环遍历它们,从而导致代码非常难看。
我也不想将do_special_calculations() 的结果保存回数据库,原因有很多(效率、潜在的陈旧数据、无法轻松保存对象)。
使每个条目的特殊计算在模板中可用的最佳方法是什么?
【问题讨论】:
-
books = self.object_list→books = list(self.object_list)?