GQL: не равный фильтр для многозначного свойства

Немного поработав с хранилищем данных 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'. Есть способ применить фильтр ко ВСЕМ? (ИСТИНА, если все значения != 'tag2')?

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

Спасибо ;)


person Gianluca Bargelli    schedule 25.01.2011    source источник


Ответы (1)


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

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

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

person speedplane    schedule 26.01.2011
comment
Джанлука Барджелли. Не могли бы вы поделиться своим решением, которое может помочь мне или другим? - person luckykrrish; 26.01.2013