Como filtro contra um StringListProperty que não contém um item?
-
19-09-2019 - |
Pergunta
Eu tenho o seguinte modelo de Usuários e quero obter todos os usuários que gostam de 'amarelo', mas não gosto 'vermelho'.
class User(db.Model):
name = db.StringProperty(required=True)
favorite_colors = db.StringListProperty(required=True)
Isso funciona (todos os usuários que têm pelo menos uma cor favorita 'amarelo' são retornados):
results = db.GqlQuery(
"SELECT * FROM User "
"WHERE favorite_colors = 'yellow'")
Mas isso não faz o que eu esperava:
results = db.GqlQuery(
"SELECT * FROM User "
"WHERE favorite_colors = 'yellow' "
"and favorite_colors != 'red'")
A mesma lista de usuários é retornado. Eu acredito que ele está testando se qualquer uma das cores favoritas são diferentes de 'vermelho' e não se a lista não contém 'vermelho' em tudo.
Como posso filtrar apenas os resultados que contêm um item e não outro?
Solução
Não é possível filtrar para a ausência de um item. Sua segunda aparência de consulta para todos que tem o item 'amarelo' em sua lista, bem como pelo menos um item que não é 'vermelho'.
Se o seu conjunto de itens é limitada, você pode querer mudar a sua representação para incluir 'não' entradas - por exemplo, "amarelo", "não azul", "não vermelho". Caso contrário, você vai precisar fazer a filtragem em código Python.