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的数据存储不是关系型的,但我想知道怎么聪明地解决或思考这种查询。
谢谢;)
1 个回答
0
我想了很多次这个问题,觉得没有一个好的解决办法(如果我错了请纠正我)。我简单的解决办法是,不使用StringListProperty,而是使用一系列的过滤器:
class Entry(db.Model):
...
tag_1 = db.StringProperty();
tag_2 = db.StringProperty();
...
Entry.all().filter('tag_1 !=', tag).filter('tag_2 !=', tag) ...
我就不开始说这个解决方案明显的问题了,但至少它能做到你想要的效果。