GQL:对多值属性的不等过滤器

2 投票
1 回答
1097 浏览
提问于 2025-04-16 10:35

我在玩谷歌应用引擎(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' """)

问题是这个查询返回了e1e2,但我只想要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) ...

我就不开始说这个解决方案明显的问题了,但至少它能做到你想要的效果。

撰写回答