2012-06-18 39 views
0

我有使用正在使用多個過濾器的查詢問題(我使用NDB代替DB):如何過濾Google AppEngine中的多個媒體資源? (蟒蛇)

... 
foo = something.query(something.a==5, something.b<8, something.c<3).order(something.b).fetch(1) 
... 

我收到此錯誤:

Only one inequality filter per query is supported. 

我能解決這個問題通過使用這樣的事情:

... 
foo = something.query(something.a==5, something.b<8).order(something.b).fetch() 
#loop through each one of those rows and add those who have foo.c<3 to some array 

,但這種解決方案是不是真的很大。有人有更好的主意嗎?

感謝

回答

1

這是我如何解決它:

foo = something.query(ndb.query.AND(something.a==5, something.b<8, ndb.query.OR(something.c==1, something.c==2))) 
+3

聰明。你可以簡化爲:something.query(something.a == 5,something.b <8,something.c.IN([1,2])):你可以免費獲得最高的AND級別,而IN是暗示着相同的財產和不同的價值。但通常情況下,限制本身仍然存在 - 您不能在同一個查詢中的多個屬性上使用<, <=, >,> =或!=。 (!=翻譯成< OR >。) –

+0

雖然這並不解決一般問題 - 如果你想要什麼東西c <100? – user1357607

+1

@GuidovanRossum如果something.c是一個浮點數?就像在這種情況下[多重不平等比較](http://stackoverflow.com/questions/34980755/ndb-multi-inequality-comparision-join-multi-queries-cursors-python-googl)。你能幫我解決這個問題嗎? –

1

您需要使用query.AND or query.OR

qry = Article.query(query.AND(Article.tags == 'python', 
           query.OR(Article.tags.IN(['ruby', 'jruby']), 
             query.AND(Article.tags == 'php', 
               Article.tags != 'perl')))) 
+0

我得到了同樣的錯誤。我正在使用多個屬性。在你的例子中,你只使用標籤,但我需要使用a,b,c。 – Vizualni

+0

@Vizualni你可以添加任何你喜歡的,而不是任何'.tags'在當前的例子... – Lipis

+0

@Lipis我知道,先生:)。我改變了這個與我的應用程序,但我有同樣的錯誤。這是困擾我的問題。 [限制查詢](https://developers.google.com/appengine/docs/python/datastore/queries#Restrictions_on_Queries) – Vizualni

2

我有一個相關的問題,我用一個ComputedProperty解決它。例如,你可以有一個ComputedProperty(lambda self:self.b < 8和self.c < 3),然後查詢該ComputedProperty是否爲真。