GQL: не равный фильтр на многоцелевой собственности
-
24-10-2019 - |
Вопрос
Немного возиться с данным Gae, я обнаружил, что не могу думать правильный способ отфильтровывать Результаты с использованием фильтра неравенства '! =' на многоцелевом свойстве:
class Entry(db.Model):
...
tags = db.StringListProperty()
e1 = Entry()
e2 = Entry()
e1.tags = ['tag1', 'tag2', 'tag3']
e2.tags = ['tag1', 'tag3', 'tag4']
# I want to exclude all the results containing 'tag2'
db.GqlQuery("""SELECT * FROM Entry
WHERE tags != 'tag2' """)
Проблема в том, что этот запрос возвращает оба E1 а также E2 Но я хочу только E2.
Я думаю, что это происходит потому, что фильтр неравенства оценивается как любая (правда, если хотя бы одно значение!
Я знаю, что хранилище GAE не является реляционным, но я хотел бы знать, как умно решить/думать об этом виде запросов.
Спасибо ;)
Решение
Я подумал об этом кучу, и я не думаю, что есть хороший способ сделать это (пожалуйста, поправьте меня, если я ошибаюсь). Мое решение, не предпринимаемое решением, состоит в том, чтобы не использовать StringListProperty и каскаду кучу фильтров:
class Entry(db.Model):
...
tag_1 = db.StringProperty();
tag_2 = db.StringProperty();
...
Entry.all().filter('tag_1 !=', tag).filter('tag_2 !=', tag) ...
Я не собираюсь описывать очевидные проблемы с этим решением, но, по крайней мере, это делает то, что вы хотите.