gpt4 book ai didi

python - GAE 中的多对多关系。查询失败

转载 作者:太空宇宙 更新时间:2023-11-03 19:31:37 26 4
gpt4 key购买 nike

我一直在使用 db.Key 实例的经典 ListProperty 来对 gae 中的多对多关系进行建模。

class Foo(db.Model):
name = db.StringProperty()
_bars = db.ListProperty(db.Key)

@property
def bars(self):
return Bar.gql("WHERE __key__ in :1", self._bars)

class Bar(db.Model):
name = db.StringProperty()

@property
def bands(self):
return Foo.gql("WHERE _bars = :1", self.key())

class QueryTest(unittest.TestCase):

def setUp(self):
db.delete(Foo.all().run())
db.delete(Bar.all().run())

def test_query_no_notification(self):
bar_1 = Bar(name="asdf")
bar_1.put()
bar_2 = Bar(name="qwer")
bar_2.put()
foo = Foo()
foo.put()
self.assertEqual(len([bar for bar in foo.bars]), 0)

def test_query_with_bars(self):
bar_1 = Bar(name="asdf")
bar_1.put()
bar_2 = Bar(name="qwe")
bar_2.put()

foo = Foo()
foo._bars.append(bar_1.key())
foo.put()
self.assertEqual(len([bar for bar in foo.bars]), 1)

在上面的代码中,第一个测试失败。当 _bars ListProperty 为空时,Bar.gql("WHERE __key__ in :1", self._bars)
返回所有 Bar 对象(而不是没有)。

但是,如果 _bars 确实包含至少一个元素,则查询运行正常。

我很好奇这是否是 GAE 中的错误,或者我编写查询的方式是错误的......

谢谢

最佳答案

这看起来确实很反常。您可以运行 AppStats,并查看正在执行哪些底层查询吗?

但是,您所做的并不是最有效的方法。当您运行像 SELECT * FROM Foo WHERE bar in :1 这样的查询时,SDK 将其分解为列表中每一项的相等查询,并单独执行它们。但是,您尝试按键查找项目,并且数据存储区有一个内置方法可以执行此操作。将当前查询替换为:

return Bar.get(self._bars)

关于python - GAE 中的多对多关系。查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5529042/

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