django - 无法理解何时在 Django 中评估 QuerySets

标签 django django-queryset lazy-evaluation

考虑以下示例

data = Employee.objects.all()
for i in data:
   print i.name

从我在这里的低估来看,它会为每个循环访问数据库。我不确定天气我是对还是错。

下一个疑问是
data = Employee.objects.get(id=1)

在这种情况下,它什么时候会访问数据库?如果我将数据存储到另一个变量中呢?

如果我做了怎么办
data = Employee.objects.all()
data1 = []
data1 = data
for i in data1:
    print i

以上和这个有什么区别?

最佳答案

  • 在你的第一种情况下,查询集被评估(因此命中数据库)once - 在循环的开始。
  • get()调用将立即访问数据库。将获取所有模型数据,并且在访问模型属性时不会访问数据库(除非它们是 ForeignKeys )。如果您已将其存储在另一个变量中,则这些实例不会以任何方式链接。例如:
    var1 = Employee.objects.get(pk=1)
    var2 = Employee.objects.get(pk=1)
    
    var1.name = 'var1'
    var2.name = 'var2'
    var2.save()
    
    print var1.name
    >>> 'var1'
    

  • 如果您想获取最新保存的对象版本,您可以调用 refresh_from_db() 方法
        var1.refresh_from_db()
        var1.name
        >>> 'var2'
    
  • 1) 和 3) 之间没有区别,因为在 3) 中,您只需通过 data1 访问查询集即可。多变的。它不会在分配时进行评估,但会在迭代时进行评估。
  • 关于django - 无法理解何时在 Django 中评估 QuerySets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34808368/

    相关文章:

    Django Rest 框架反向关系在代理后面时中断

    Django:使 ModelChoiceField 在运行时评估查询集

    python - 如何访问 Django 中查询集的特定字段?

    algorithm - Haskell 中惰性求值和严格求值的比较

    python - Django 'null value in column'

    显示 django "class name"对象而不是名称

    django - 如何在 Django 中通过 "filter" "exists"?

    java - 并行无限 Java 流耗尽内存

    r - magrittr 管道内的 enquo()

    python - 返回按日期分组的列表的 QuerySet