peewee的get方法如何知道如何生成where子句?

时间:2017-10-08 16:34:50

标签: python peewee

Python的peewee orm库允许我使用get方法查询数据库,如下所示:

grandma = Person.get(Person.name == 'Grandma L.')

此查询将根据在幕后执行sql where的Person名称过滤结果集。

我知道首先计算表达式Person.name == 'Grandma L.',而get方法只接收一个布尔值。

get方法如何检查它的参数以检测过滤器是否需要应用于'name'字段?

PS:我读过peewee的消息来源但是不知道它是如何做到的。

1 个答案:

答案 0 :(得分:3)

  

我知道首先计算表达式Person.name == 'Grandma L.',而get方法只接收一个布尔值。

我不认识Peewee,但我确实知道这是怎么做的。

基本上,你的句子的第二部分不是真的。 name属于自定义类型。它的__eq__方法不仅返回一个布尔值,而是一个包含实际完成比较的信息的对象。 (这个类甚至可能来自bool,所以它在其他上下文中就像一个布尔。)它的其他丰富的比较方法是相似的。

Person.name如何知道其名称为name 的答案是Person可能实际上没有name属性。相反,它有一个__getattr__()方法返回name对象,该对象是我刚才描述的__eq__方法的自定义类。

由于Person.__getattr__()收到属性的名称,因此可以将该名称烘焙为它为name返回的值。然后__eq__上的自定义name方法返回一个类似布尔的对象,其中包含name == 'Grandma L.'的一些表示。 Person.get()使用此表示法将查询放在一起。