我有+5小时的培训来解释如何:Item.objects.values('type', 'state')
返回一个只包含两个键的字典。
然而Item.objects.values('type', 'state').annotate(nb=Count('id'))
有效!!
如果id
属性不是由值函数返回,那么解释器如何知道IWebElement
属性存在?
答案 0 :(得分:1)
您的模型在后台具有ID,并且Django ORM也知道您的模型定义
Django ORM 延迟加载并且在调用result之前不会执行任何操作。因此,当您调用注释时,它还不是字典,它仍然是对象。在您要求结果的那一刻,它会触发对数据库的查询并返回结果
Django ORM将此转换为与此
类似的数据库查询SELECT type, state, count(id) as nb FROM items
答案 1 :(得分:1)
它知道id
属性存在,因为Item.objects.values('type', 'state')
不仅仅是字典。它是根据您提供的参数将表示本身作为字典的对象。
想象一下,对象是一张纸,让我们称之为论文A
:
id : 1
type : cheese
state : melted
当您调用它时,您实际看到的是通过仅显示相关部分而创建的对象的表示形式,例如在A
顶部放置孔的纸张,{B
1}}:
████████████████████
████████████████████
+--------------------+
|type: cheese |
+--------------------+
+--------------------+
|state: melted |
+--------------------+
但论文A
仍然在论文B
下面,完好无损。这就是为什么Item.objects.values('type', 'state').annotate(nb=Count('id'))
有效的原因:当annotate
去查看对象时,它会询问它实际上是什么 ,而不是它看起来像什么对外部观察员换句话说,annotate
查看了论文A
,不是论文B
。
通过让对象Item.objects.values('type', 'state')
以不同的方式表示用户和系统,它允许系统在需要检查时保留尽可能多的信息。这在ORM模型中很常见,因此数据库和数据库表示之间不会出现差异。
答案 2 :(得分:0)
第一个查询不返回带有两个键的字典。相反,它返回一个ValuesQuerySet;该查询集的每个元素都是一个字典。
与任何其他查询集一样,ValuesQuerySet保留与模型的连接,因此可以根据需要向查询添加任何其他元素。在迭代查询集之前,不会执行整个查询。