Как фильтровать StringListProperty, который не содержит элемента?
-
19-09-2019 - |
Вопрос
У меня есть следующая модель пользователей, и я хочу получить всех пользователей, которым нравится «желтый», но не нравится «красный».
class User(db.Model):
name = db.StringProperty(required=True)
favorite_colors = db.StringListProperty(required=True)
Это работает (возвращаются все пользователи, у которых есть хотя бы один любимый цвет «желтый»):
results = db.GqlQuery(
"SELECT * FROM User "
"WHERE favorite_colors = 'yellow'")
Но это не делает то, что я ожидал:
results = db.GqlQuery(
"SELECT * FROM User "
"WHERE favorite_colors = 'yellow' "
"and favorite_colors != 'red'")
Возвращается тот же список пользователей.Я считаю, что он проверяет, отличается ли какой-либо из любимых цветов от «красного», а не проверяется, не содержит ли список вообще «красный».
Как я могу фильтровать только те результаты, которые содержат один элемент, а не другой?
Решение
Вы не можете фильтровать отсутствие элемента.Ваш второй запрос ищет всех, у кого в списке есть элемент «желтый», а также хотя бы один элемент, который не является «красным».
Если ваш набор элементов ограничен, вы можете изменить свое представление, включив в него записи «не» - например, «желтый», «не синий», «не красный».В противном случае вам придется выполнить фильтрацию в коде Python.