2009-12-13 2 views
1

J'ai le modèle suivant d'utilisateurs et je veux obtenir tous les utilisateurs qui aiment «jaune», mais n'aime pas «rouge».Comment filtrer contre un objet StringListProperty qui ne contient pas d'élément?

class User(db.Model): 
    name = db.StringProperty(required=True) 
    favorite_colors = db.StringListProperty(required=True) 

Cela fonctionne (tous les utilisateurs qui ont au moins une couleur préférée 'jaune' sont de retour):

results = db.GqlQuery(
    "SELECT * FROM User " 
    "WHERE favorite_colors = 'yellow'") 

Mais cela ne fait pas ce que je pensais:

results = db.GqlQuery(
    "SELECT * FROM User " 
    "WHERE favorite_colors = 'yellow' " 
    "and favorite_colors != 'red'") 

Le la même liste d'utilisateurs est renvoyée. Je crois que cela teste si l'une des couleurs préférées est différente de «rouge» et non si la liste ne contient pas de «rouge» du tout.

Comment puis-je filtrer uniquement les résultats qui contiennent un élément et pas un autre?

Répondre

1

Vous ne pouvez pas filtrer pour l'absence d'un élément. Votre deuxième requête recherche tout le monde qui a l'élément «jaune» dans leur liste, ainsi que au moins un élément qui n'est pas «rouge».

Si votre ensemble d'éléments est limité, vous pouvez changer votre représentation pour inclure des entrées «non» - par exemple, «jaune», «non bleu», «non rouge». Sinon, vous devrez faire le filtrage en code Python.

+1

Je ne sais pas si je serai en mesure de faire le filtrage en code Python car mon ensemble de "couleurs" a ~ 3k éléments et les "utilisateurs" ~ 40k et l'API datastore ne renvoie que les 1000 premiers résultats. Merci quand même! – jbochi

Questions connexes