Skip to main content
 首页 » 编程设计

python之GQL:多值属性的不相等过滤器

2025年05月04日7lonelyxmas

对 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',则为 TRUE。有一种方法可以将过滤器应用于 ALL?(如果所有值都是 TRUE,则为 != 'tag2 ')?

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

谢谢;)

请您参考如下方法:

这个问题我想了很多,我觉得没有什么好的方法(如果我错了请指正)。我不聪明的解决方案是不使用 StringListProperty 并级联一堆过滤器:

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

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