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() 使用此表示来组合查询。