gpt4 book ai didi

google-app-engine - NDB 在重复的 Expando StructuredProperty 中查询 GenericProperty

转载 作者:行者123 更新时间:2023-12-02 22:21:40 30 4
gpt4 key购买 nike

大家好,我正在尝试弄清楚如何针对以下情况构造我的查询

首先我定义了一个模型

class Variant(ndb.Expando):
test = ndb.StringProperty()


class Item(ndb.Model):
test2 = ndb.StringProperty()
variants = ndb.StructuredProperty(Variant, repeated=True)

variant = Variant(test="test", dynamic="a")
item = Item(test2="test", variants=[variant, ])
item.put()

然后是查询内容..到目前为止我已经尝试过了

dynamic = "dynamic"
Item.query(ndb.GenericProperty("variants.%s" % dynamic) == "a")
Item.query(Item._properties["variants.%s" % dynamic] == "a")
Item.query(getattr(Item.variants, dynamic) == "a")
Item.query(getattr(Item, "variants.%s" % dynamic) == "a")
Item.query(ndb.query.FilterNode("variants.%s" % dynamic, "=", "a"))

generic_prop = ndb.GenericProperty()
generic_prop._name = "variants.%s" % dynamic
Item.query(generic_prop == "a")

并且这些都不起作用..这应该是完全可能的,因为数据存储中的属性名称是

variants.dynamic = ["a", ]

谢谢你的帮助

最佳答案

使用 GQL 很容易:

Item.gql("WHERE variants.dynamic = 'a'").fetch()

这也有效:

s = StringProperty()
s._name = 'variants.dynamic')
Item.query(s == 'a').fetch()

请提交功能请求;但这将是一个平衡的行为。您想使用什么语法?

更新:

同样的事情适用于 GenericProperty() 或任何其他 Property 子类。

GenericProperty('variants.dynamic') 被禁止的原因是为了防止人们像这样进行黑客攻击:

class MyHack(ndb.Model):
foo = StringProperty('bar.baz')

这会混淆序列化和反序列化代码。

也许我们可以向 Property 添加一个标志来跳过此检查,但随后不允许在模型定义中使用该属性(它只允许在查询中使用)。

或者也许我们可以完成这项工作(虽然我认为这很难):

Item.query(Item.variants.dynamic == 'a').fetch()

(仅当 variants 是 Expando 时)。

关于google-app-engine - NDB 在重复的 Expando StructuredProperty 中查询 GenericProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13631884/

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