如果我有不同的方法,我不应该使用for循环吗?避免大o(n)?所以这就是我所拥有的。
models.py
class Drama(models.Model):
name = models.CharField(max_length=255)
views.py
def index(request):
theOffice = Drama.objects.filter(name='The Office')
return render(request, 'index.html', {
'theOffice':theOffice,
})
现在在模板中
{{ theOffice.name }}
上面什么也没显示,真正困扰我的是 如果我使用for循环,则可以使用
{% for theOffi in theOffice %}
{{ theOffi.name }}
{% endfor %}
但是然后,使用过滤器有什么意义呢?我只需获取objects.all()并使用
{% if drama.name == "the office %}
我错过了什么吗?我真的很困惑
答案 0 :(得分:0)
过滤器返回一个数组。 If you use Drama.objects.filter(name='The Office')[0]
您的代码将正常工作
答案 1 :(得分:0)
遍历和测试所有元素需要花费线性时间。如果您有100万个元素,那么即使只有5个元素匹配,也需要进行100万个比较。
遍历filter
的结果并不会花费线性时间。
filter
可以使用基础数据库或其他后端仅查找匹配的元素。通常,这比线性时间要好-例如,对于一个典型的数据库,其中的值是平均宽度为10的b树中的索引,它可以在log(1_000_000, 10) + 5 = 11
比较中找到5个匹配项。远远超过一百万。
由于可能有5个匹配项(或0或20个),因此您仍然会返回QuerySet
,这很麻烦,您必须进行循环。但是您只循环5个匹配项,而不是100万个元素,因此您的总复杂度为11 + 5 = 16
,仍然比100万个要好得多。
如果您知道总会有1个匹配的事实,那么您甚至不需要遍历它们。只需将第一个与Drama.objects.filter(name='The Office')[0]
一起使用。然后,搜索进行6个比较。
与循环的6 + 1 = 7
步相比,这6步并不是什么优化。但这不是为什么要这样做;您这样做是出于简单性和正确性: