【问题标题】:GQL: Not equal filter on a multivalued propertyGQL:多值属性上的不等于过滤器
【发布时间】:2011-01-25 15:25:52
【问题描述】:

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

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

谢谢 ;)

【问题讨论】:

    标签: python google-cloud-datastore gql multivalue


    【解决方案1】:

    我想了很多,但我认为没有什么好的方法(如果我错了,请纠正我)。我不聪明的解决方案是不使用 StringListProperty 并级联一堆过滤器:

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

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

    【讨论】:

    • 吉安卢卡·巴杰利。您介意分享可以帮助我或其他人的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多