Python的peewee orm库允许我使用get
方法查询数据库,如下所示:
grandma = Person.get(Person.name == 'Grandma L.')
此查询将根据在幕后执行sql where
的Person名称过滤结果集。
我知道首先计算表达式Person.name == 'Grandma L.'
,而get
方法只接收一个布尔值。
get
方法如何检查它的参数以检测过滤器是否需要应用于'name'字段?
答案 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()
使用此表示法将查询放在一起。