2010-09-07 3 views
0

J'ai une entité avec une propriété d'auto-référence et je voulais rechercher avec une condition WHERE sur la clé du champ selfref. Mon intention est de réduire les hits DB en construisant une liste de clés, puis en itérant sur la même entité pour construire une liste imbriquée. J'utilise cette liste pour frapper memcache.get_multi() pour une version de dictionnaire en cache des résultats que je veux retourner. Voici une version abrégée du entitiy:GqlQuery avec la clé de propriété selfreference

class Link(db.Model):  
    member = db.ReferenceProperty(Member)  
    url = db.TextProperty() 
    title = db.StringProperty() 
    category =db.SelfReferenceProperty() 

J'ai construit un dictionnaire clé « catégorie » basée sur une autre entité qui stocke les informations d'accès. Ce que je veux faire est quelque chose comme:

for categoryKey in accessDict: 
    categoryDBKey = db.Key(categoryKey) 
    q = db.GqlQuery('SELECT __key__ FROM Link WHERE category.key() = :1',categoryDBKey) 

for qItem in q: 
    cacheList.append('Link_' + str(qItem)) 
    dataCache = memcache.get_multi(cacheList) 

Mais je reçois le « BadQueryError: Invalid condition WHERE: Erreur d'analyse » erreur.

Je sais que je peux passer toute entité catégorie:

for categoryKey in accessDict: 
    category = db.ket(db.Key(categoryKey)) 
    q = db.GqlQuery('SELECT __key__ FROM Link WHERE category = :1',category) 

, mais il semble que RPCs gaspillés si je possède déjà la valeur de clé pour la catégorie que je veux filtrer.

Existe-t-il un moyen d'utiliser une condition WHERE sur une clé de référence?

Merci

Répondre

2

propriétés de référence sont stockées sous forme de clés, afin que vous puissiez les comparer directement:

for categoryKey in accessDict: 
    q = db.GqlQuery('SELECT __key__ FROM Link WHERE category = :1', db.Key(categoryKey)) 
+0

Merci Drew, je dois avoir essayé toutes les combinaisons mais le plus simple qui a fonctionné. – user441842

Questions connexes