我已经看过文档、文档等问题和答案,但仍在努力理解其中的一小部分。你应该在什么时候选择?在
这是我目前所读到的(只是示例):
关键类对我来说很简单。当您创建一个ndb实体时,数据存储会自动为您创建一个密钥,通常以key(Kind,id)的形式为您创建id。在
假设你有两个模型:
class Blah(ndb.Model):
last_name = ndb.StringProperty()
class Blah2(ndb.Model):
first_name = ndb.StringProperty()
blahkey = ndb.KeyProperty()
所以只要使用键类型,你就想让Blah1成为父母(或者有几个姓氏相同的家庭成员)
^{pr2}$然后:
lname = Blah2( parent=fname_key, first_name = "Napoleon")
lname.put()
lname2 = Blah2( parent=fname_key, first_name = "Lucien")
lname2.put()
到目前为止还不错(我想)。关于Blah2的KeyProperty。假设Blah1仍然相同。在
lname3 = Blah2( first_name = "Louis", blahkey = fname_key)
lname3.put()
这是对的吗?在
如何查询各种事物
查询姓氏:
Blah.query() # all last names
Blah.query(last_name='Bonaparte') # That specific entity.
名字:
Blah2.query()
napol = Blah2.query(first_name = "Napoleon")
bonakey = napol.key.parent().get() # returns Bonaparte's key ??
bona = bonakey.get() # I think this might be redundant
这就是我迷路的地方。如何使用key或keyproperty从名字中寻找Bonaparte。我没有在这里加上,也许应该有,这是关于父母,祖父母,伟大的祖父母的讨论,因为钥匙记录着祖先/父母。在
如何以及为什么要使用KeyProperty而不是固有的key类。同时假设你有3个传感器s1,s2,s3。每个传感器都有上千个读数,但你要保持读数与s1相关联,这样你就可以用图表表示今天s1的所有读数。你会用哪个?KeyProperty还是key类?如果这个问题在其他地方得到了回答,我很抱歉,但是我没有看到一个明确的例子/指南来说明选择哪个以及为什么/如何选择。在
我也是NDB新手,我现在还不完全理解,但我认为当你用一个父对象为Napoleon创建Blah2时,你需要父对象来查询它,否则就不会出现。例如:
不会得到任何东西(而且您没有为NDB使用正确的格式),但是使用父对象可以:
^{pr2}$不知道这是否为你的问题提供了一些线索。在
我想这是因为使用了钥匙。键不与实体内部的任何属性相关联,它只是定位单个实体的唯一标识符。它可以是数字或字符串。在
幸运的是,除了这一行之外,所有代码看起来都很好:
构造键需要一个唯一的ID,这与属性不同。也就是说,它不会将变量
^{pr2}$lname.last_name
与属性last_name
相关联。相反,您可以这样创建记录:保证只有一个Blah实体具有该ID。实际上,如果您使用像last_name这样的字符串作为ID,则不需要将其存储为单独的属性。可以将实体ID视为唯一的额外字符串属性。在
下一步要小心,不要假设姓什么和Blah2.first_name在您的查询中是唯一的:
如果您不止一次这样做,将会有多个名为Napoleon的实体(都具有相同的父密钥)。在
继续上面的代码:
napol
保存查询,而不是结果。您需要调用napol.fetch()
来获取所有带有“Napolean”的实体(如果确定只有一个实体,则调用napol.get()
)。bonakey
则相反,它持有父实体是因为get()而不是Bonaparte的键。如果不关闭.get(),则bona
将正确地拥有父对象。在最后,你关于传感器的问题。您可能不需要KeyProperty或“固有”键。如果你有这样的阅读课:
然后,您可以将它们全部存储在一个没有键的表中。(您可能希望包含时间戳或其他属性。)稍后,您可以使用以下查询检索then:
相关问题 更多 >
编程相关推荐