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

时间:2011-01-25 15:25:53

标签: python google-cloud-datastore gql multivalue

使用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

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

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

谢谢;)

1 个答案:

答案 0 :(得分:0)

我已经考虑了这一堆,我认为没有一个好方法可以做到(如果我错了请纠正我)。我的非聪明的解决方案是不使用StringListProperty并级联一堆过滤器:

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

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