gpt4 book ai didi

python - 如何使用 Expando 查询事先未知的多个属性?

转载 作者:行者123 更新时间:2023-12-01 02:23:26 24 4
gpt4 key购买 nike

我正在制作一个应用程序,用户可以在其中创建类别以将项目放入其中。这些项目共享一些基本属性,但其余属性由它们所属的类别定义。问题在于类别及其特殊属性都是由用户创建的。

例如,用户可以创建两个类别:书籍和按钮。在“书籍”类别中,他可以创建两个属性:页数和作者。在按钮类别中,他可以创建不同的属性:孔数和颜色。

最初,我将这些属性放置在 Item 内的 JsonProperty 中。虽然这有效,但这意味着我只需指定要查找的类别即可查询数据存储区,然后我必须在代码中过滤查询结果。例如,如果我正在查找作者为 Carl Sagan 的所有书籍,我将使用 Category == books 查询 Item 类,并循环遍历结果以仅保留与作者匹配的书籍。

虽然我并不真正期望每个类别有那么多项目(可能有数百个,不太可能达到一千个),但这看起来效率很低。因此,我尝试使用 ndb.Expando 来使这些特殊属性成为索引的真实属性。我这样做了,在将项目放入数据存储区时为其添加了相应的特殊属性。因此,如果用户在“书籍”类别中创建一个项目,并且之前在该类别中创建了特殊属性“作者”,则项目将使用特殊属性 Expando_author =author 进行保存。到目前为止,它按我的预期工作(开发服务器)。

当我做了一些查询时,真正的问题就变得明显了。当他们在开发服务器中工作时,他们为每个特殊/扩展属性创建了复合索引,即使查询过滤器只是相等的。虽然每个类别最多可以有五个属性,但很明显它很容易失控。

示例查询:

items = Item.query()
for p in properties:
items = items.filter(ndb.GenericProperty(p)==properties[p])
items.fetch()

现在,由于我事先不知道属性是什么(尽管我将其限制为 5),所以我无法在上传应用程序之前构建索引,即使我知道这可能意味着有更多我喜欢的索引。对于我想要做的事情来说,Expando 是错误的工具吗?我应该继续使用 JsonProperty 过滤代码中的结果吗?如果我能得到任何建议,我将不胜感激。

PD。为了使这篇文章更短,我省略了一些关于我所做的事情的细节,如果您需要知道我可能遗漏的内容,请在评论中询问。

最佳答案

考虑将类别的属性存储在单个列表属性中,并以类别属性名称为前缀。

就像(忘了我,我忘记了确切的 Python 语法,改用 Go)

class Item():
props = StringListProperty()

book = Item(category='book', props=['title:Carl Sagan'])
button = Item(category='button', props=['wholes:5'])

然后您可以在 category+props 上建立一个复合索引并执行如下查询:

def filter_items(category, propName, propValue):
Item.filter(Item.category == category).filter(Item.props==propName+':'+propValue)

并且您需要 Item 上的一个函数来从属性名称中清除属性值。

关于python - 如何使用 Expando 查询事先未知的多个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47699384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com