2

稍微修改一下 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

我认为这是因为不等式过滤器的计算结果为 ANY(如果至少一个值为 != 'tag2',则为 TRUE。有一种方法可以将过滤器应用于 ALL?(如果所有值都是 !='tag2',则为 TRUE)?

我知道 GAE 的数据存储不是关系型的,但我想知道如何巧妙地解决/思考这种查询。

谢谢 ;)

4

1 回答 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) ...

我不会开始描述此解决方案的明显问题,但至少它可以满足您的需求。

于 2011-01-26T16:12:26.567 回答