【问题标题】:why does the models.objects.filter take less time then the models.objects.get?为什么models.objects.filter 比models.objects.get 花费更少的时间?
【发布时间】:2019-12-07 03:11:26
【问题描述】:

即使过滤器可以处理对象的数量,为什么它很快?

正如我们所见,过滤器为您提供查询集,但 get 方法为您提供单个对象 但是如果我通过切片(无循环)选择单个对象或使用 get 方法选择对象,那么即使在拥有查询集之后,拥有查询集也不等于拥有所有对象

我试图获取时差

from time import time

   def f1():
    t0 = time()
    User.objects.filter(username='risha')
    print("Execution time of f1: {}".format(time() - t0))

def f2():
    t0 = time()
    User.objects.get(username='risha')
    print("Execution time of f2: {}".format(time() - t0))
f1()
f2()

所以结论是 f1的执行时间:0.0009980201721191406 f2的执行时间:0.0029938220977783203

但是为什么过滤器在处理更多对象时却花费更少的时间?

【问题讨论】:

  • 如果您想了解两个选项之间的时间差异,请尝试通过在循环中多次运行代码(例如 1000 或 10000)来进行分析。
  • 为什么过滤器在处理更多对象时却花费更少的时间?

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:

User.objects.filter(username='risha') 返回的QuerySet 被延迟评估。

这意味着除非您对list(User.objects.filter(username='risha')) 计时,否则您不会执行任何真正的数据库查询。

【讨论】:

  • get 是做什么的?如果过滤器更好,那么甚至可以使用单个对象进行工作,那么 get 有什么用?
  • 过滤器将返回一个项目列表。据我所知,这不是更好。它在您的工作台上看起来更快,因为它不执行数据库查询!
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2014-05-30
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
相关资源
最近更新 更多