2012-03-02 74 views
5

我剛剛有機會看看web2py框架,雖然我對Django有一些以前的經驗,對於普通的Python也有一些經驗,但我從web2py所使用的查詢系統中無法理解。web2py查詢表達式如何工作?

讓我們從web2py book

db = DAL('sqlite://storage.db') 
myquery = (db.mytable.myfield > 'A') 
myset = db(myquery) 
rows = myset.select() 
for row in rows: 
    print row.myfield 

In a SO comment的web2py筆者這個例子說,(db.mytable.myfield > 'A')不直接評估爲True/False,並且它實際上是在選擇時每行評估。我明白這是允許這些表達式用作查詢對象,甚至可以組合使用的東西。

我試着找到這個在線答案,但不能,所以這裏是我的問題:這些查詢表達式如何不馬上評估爲True/False?爲什麼myquery的價值不是真的?我可能丟失了什麼Python功能可以使用這個功能?

回答

7

其他的答案都有,但只是提供一個更具體一點的web2py細節:

db.mytable.myfield > 'A' 

db.mytable.myfield是web2py的DAL Field類,從DAL Expression類繼承的一個實例。 Expression類本身重載了許多Python運算符,如==,<,>等。這些重載運算符在應用於Expression(因此爲Field)對象時將返回DAL Query類的實例,而不是標準Python布爾對象。這裏是source code>__gt__)運算符。

請參閱here瞭解更多運算符在Python中重載

2

根據對special methods的評估,應用於自定義(非內置)對象的任何運算符。它被廣泛地稱爲operator overloading。 所以基本上字段類定義都看上去:

class DBField(...): 
#... 

    def __gt__(self,value): 
     #building query object, based on value 
     return query