django值函数奇怪的行为?

时间:2017-02-23 16:19:35

标签: python django

我有+5小时的培训来解释如何:Item.objects.values('type', 'state')返回一个只包含两个键的字典。

然而Item.objects.values('type', 'state').annotate(nb=Count('id'))有效!!

如果id属性不是由值函数返回,那么解释器如何知道IWebElement属性存在?

3 个答案:

答案 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保留与模型的连接,因此可以根据需要向查询添加任何其他元素。在迭代查询集之前,不会执行整个查询。