为什么不使用forloop就无法从模型中检索数据

时间:2018-09-10 00:59:54

标签: python django

如果我有不同的方法,我不应该使用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 %}
我错过了什么吗?我真的很困惑

2 个答案:

答案 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步并不是什么优化。但这不是为什么要这样做;您这样做是出于简单性和正确性:

  • 您知道将只有一个值,因此您可以在代码中将其明确显示,然后对任何读者来说都是显而易见的。
  • 您的代码更短,更容易阅读。
  • 如果您错了,并且实际上有时没有匹配项,则会得到一个异常而不是没有输出,这更易于调试。