peewee 的 get 方法如何知道如何生成 where 子句?
How does peewee's get method knows how to generate where clause?
Python 的 peewee orm 库允许我使用 get
方法查询数据库,如下所示:
grandma = Person.get(Person.name == 'Grandma L.')
此查询将根据人名在幕后执行 sql where
过滤结果集。
我知道首先计算表达式 Person.name == 'Grandma L.'
并且 get
方法只接收一个布尔值。
get
方法如何检查其参数以检测过滤器是否需要应用于 'name' 字段?
PS:我阅读了 peewee 的来源,但不知道它是如何做到的。
I know the expression Person.name == 'Grandma L.'
is evaluated first and the get
method receives just a boolean value.
我不太了解 Peewee,但我知道这种事情是如何完成的。
基本上,你的句子的第二部分是不正确的。 name
属于自定义类型。它的 __eq__
方法不 return 只是一个布尔值,而是一个对象,其中包含有关实际进行了哪些比较的信息。 (这个 class 甚至可能派生自 bool
所以它在其他上下文中像布尔值一样工作。)它的其他丰富的比较方法是相似的。
但是Person.name
怎么知道它的名字是name
呢? that 的答案是 Person
实际上可能没有 name
属性。相反,它有一个 return 对象 name
的 __getattr__()
方法,这是具有我刚才描述的 __eq__
方法的自定义 class。
由于 Person.__getattr__()
收到属性的名称,它可以将该名称烘焙到 return 的值中 name
。然后 name
return 上的自定义 __eq__
方法是一个类似布尔值的对象,其中包含 name == 'Grandma L.'
的一些表示形式。 Person.get()
使用此表示来组合查询。
Python 的 peewee orm 库允许我使用 get
方法查询数据库,如下所示:
grandma = Person.get(Person.name == 'Grandma L.')
此查询将根据人名在幕后执行 sql where
过滤结果集。
我知道首先计算表达式 Person.name == 'Grandma L.'
并且 get
方法只接收一个布尔值。
get
方法如何检查其参数以检测过滤器是否需要应用于 'name' 字段?
PS:我阅读了 peewee 的来源,但不知道它是如何做到的。
I know the expression
Person.name == 'Grandma L.'
is evaluated first and theget
method receives just a boolean value.
我不太了解 Peewee,但我知道这种事情是如何完成的。
基本上,你的句子的第二部分是不正确的。 name
属于自定义类型。它的 __eq__
方法不 return 只是一个布尔值,而是一个对象,其中包含有关实际进行了哪些比较的信息。 (这个 class 甚至可能派生自 bool
所以它在其他上下文中像布尔值一样工作。)它的其他丰富的比较方法是相似的。
但是Person.name
怎么知道它的名字是name
呢? that 的答案是 Person
实际上可能没有 name
属性。相反,它有一个 return 对象 name
的 __getattr__()
方法,这是具有我刚才描述的 __eq__
方法的自定义 class。
由于 Person.__getattr__()
收到属性的名称,它可以将该名称烘焙到 return 的值中 name
。然后 name
return 上的自定义 __eq__
方法是一个类似布尔值的对象,其中包含 name == 'Grandma L.'
的一些表示形式。 Person.get()
使用此表示来组合查询。