GQL: Неравный фильтр для многозначного свойства - PullRequest
2 голосов
/ 25 января 2011

Немного повозившись с хранилищем данных 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 .

Я думаю, что это происходит потому, что фильтр неравенства оценивается как ЛЮБОЙ (ИСТИНА, если хотя бы одно значение равно! = 'Tag2'. Есть способ применить фильтр ко ВСЕМ? (ИСТИНА, если все значения есть! = 'Тег2 «)

Я знаю, что хранилище данных GAE не реляционное, но я хотел бы знать, как умно решать / думать такого рода запросы.

Спасибо;)

1 Ответ

0 голосов
/ 26 января 2011

Я думал об этом кучу, и я не думаю, что есть хороший способ сделать это (пожалуйста, поправьте меня, если я ошибаюсь). Мое неумное решение состоит в том, чтобы не использовать StringListProperty и каскадировать несколько фильтров:

class Entry(db.Model):
  ...
  tag_1 = db.StringProperty();
  tag_2 = db.StringProperty();
  ...
Entry.all().filter('tag_1 !=', tag).filter('tag_2 !=', tag) ...

Я не собираюсь описывать очевидные проблемы с этим решением, но, по крайней мере, он делает то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...