2010-03-26 44 views
4

我想要做的是查詢數據存儲模型的關鍵是而不是我已經有一個對象的關鍵。下面是一些代碼:按鍵查詢模型

class User(db.Model): 
    partner = db.SelfReferenceProperty() 

def text_message(self, msg): 
    user = User.get_or_insert(msg.sender) 

    if not user.partner: 
     # user doesn't have a partner, find them one 
     # BUG: this line returns 'user' himself... :(
     other = db.Query(User).filter('partner =', None).get() 
     if other: 
      # connect users 
     else: 
      # no one to connect to! 

的想法是找到另一個User誰不有一個合作伙伴,這是不是我們已經知道該用戶。

我試過filter('key !=, user.key())filter('__key__ !=, user.key())和其他一些,沒有什麼會返回另一個User誰沒有合作伙伴。 filter('foo !=, user.key())也沒有返回任何記錄。

+2

爲什麼downvote? – 2010-06-25 16:31:18

回答

4

這裏有一個非常簡單的方法:檢索兩條記錄,並篩選出用戶自己的記錄(如果存在)。

def text_message(self, msg): 
    user = User.get_or_insert(msg.sender) 

    if not user.partner: 
     # user doesn't have a partner, find them one 
     other = db.Query(User).filter('partner =', None).fetch(2) 
     other = [u for u in other if u.key() != user.key()] 
     if other: 
      # connect user with other[0] 
     else: 
      # no one to connect to! 
+0

我想過這個,它肯定會起作用,但它看起來像一個黑客。在查詢中按鍵過濾是不可能的? – 2010-03-26 11:47:53

+0

這是可能的,你的查詢應該可以工作 - 沒有更多細節我不能告訴你他們爲什麼不是。但是,它們的效率也遠遠低於這種方法:!=查詢需要執行兩個底層查詢,這是一個鈍的工具,可以消除結果集中的單個結果。 – 2010-03-26 12:48:24

+0

呵呵,那麼取兩個其實更好?有趣。這是我的代碼,如果你好奇:http://gist.github.com/344873 – 2010-03-26 13:17:06