【问题标题】:How to filter() for different items?如何过滤()不同的项目?
【发布时间】:2011-01-28 15:12:08
【问题描述】:

这是对我的previous question 的跟进。

我用的是同款

class Item(db.Model):
    ...   
    glam = db.StringProperty()
    casual = db.StringProperty()
    speaking = db.StringProperty()

并假设我有 2 个项目,其中 1 个被标记为“glam”,另一个被标记为“speaking”。

如果我这样过滤

    query.filter("glam", "glam")
    query.filter("speaking"), "speaking")

过滤器不返回任何内容,因为它会查找标记为“glam”和“speaking”的 1 个项目。

如何过滤单独的项目?

更新

Item 表可能如下所示:

         glam    speaking
        -------------------
item1
item2    glam
item3            speaking
item4
item5    glam

我想过滤“glam”和“speaking”

【问题讨论】:

    标签: python google-app-engine filter google-cloud-datastore


    【解决方案1】:

    使用您当前的架构和当前的数据存储 API,您无法通过单个查询来实现这一目标。

    如果“glam”、“casual”和“speaking”相互排斥,您可以在单个字段上使用IN 查询:

    class Item(db.Model):
       ...
       tag = db.StringProperty()
    
    query.filter("tag IN", ["glam", "speaking"])
    

    您也可以使用实验性的Datastore Plus API 并进行 OR 查询(通过在内部合并两个查询的结果来实现):

    # Note: Your model must be a Datastore Plus model; this may require some restructuring!
    q1 = query.filter("glam =", "glam")
    q2 = query.filter("speaking =", "speaking")
    for result in q1.OR(q2):
        ....
    

    请注意,datastore plus API 仍在开发中,所以我不确定这些查询是否并行运行,但它们最终应该是。此外,由于 Datastore Plus API 仍处于试验阶段且正在开发中,您可能必须更改代码以响应 API 变化。不过,您至少可以控制这些更新何时发生。

    【讨论】:

    • 感谢您的回答。我现在不想使用实验性的 Datastore Plus API。那么,在数据存储中处理image tagging 的最佳方法是什么?我应该更改我的架构并使用one-to-many 关系吗?
    • 您可以使用 StringListProperty (code.google.com/appengine/docs/python/datastore/…) - 然后您可以通过简单地对同一属性使用多个相等过滤器来执行 AND 查询。
    • 我尝试了 StringListProperty 但我注意到如果我对“glam”和“casual”使用多个过滤器;带有标签 ["glam", "casual"] 的商品将被退回,但不会退回带有标签 [glam] 的另一商品。
    • 列表解决方案似乎是目前最好的,我切换到了。它工作得很好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2022-11-02
    相关资源
    最近更新 更多