2010-03-26 6 views
4

Ce que j'essaie de faire est d'interroger la banque de données pour un modèle où la clé est pas la clé d'un objet que j'ai déjà. Voici un code:Requête pour le modèle par clé

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! 

L'idée est de trouver un autre User qui ne dispose pas d'un partenaire, ce n'est pas l'utilisateur que nous savons déjà.

J'ai essayé filter('key !=, user.key()), filter('__key__ !=, user.key()) et quelques autres, et rien ne retourne un autre User qui n'a pas de partenaire. filter('foo !=, user.key()) ne renvoie également rien, pour l'enregistrement.

+2

Pourquoi le downvote? –

Répondre

4

Il y a un moyen très simple de contourner ceci: Récupérer deux enregistrements, et filtrer celui de l'utilisateur, s'il est présent.

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

J'ai pensé à cela, et ça marcherait certainement, mais ça a l'air d'être un hack. Est-il impossible de filtrer par clé dans une requête? –

+0

C'est possible, et vos requêtes devraient fonctionner - sans plus de détails, je ne peux pas vous dire pourquoi elles ne le sont pas. Cependant, ils seraient aussi sensiblement moins efficaces que cette approche: Les requêtes requièrent deux requêtes sous-jacentes à exécuter, ce qui est un peu un instrument contondant juste pour éliminer un seul résultat de l'ensemble de résultats. –

+0

Oh, alors aller chercher deux est vraiment mieux? Intéressant. Voici mon code si vous êtes curieux: http://gist.github.com/344873 –

Questions connexes