了解ndb密钥类与密钥属性

2024-07-02 09:14:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经看过文档、文档等问题和答案,但仍在努力理解其中的一小部分。你应该在什么时候选择?在

这是我目前所读到的(只是示例):

关键类对我来说很简单。当您创建一个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类?如果这个问题在其他地方得到了回答,我很抱歉,但是我没有看到一个明确的例子/指南来说明选择哪个以及为什么/如何选择。在


Tags: keynameputqueryfnameparentfirstlast
2条回答

我也是NDB新手,我现在还不完全理解,但我认为当你用一个父对象为Napoleon创建Blah2时,你需要父对象来查询它,否则就不会出现。例如:

napol = Blah2.query(first_name = "Napoleon")

不会得到任何东西(而且您没有为NDB使用正确的格式),但是使用父对象可以:

^{pr2}$

不知道这是否为你的问题提供了一些线索。在

我想这是因为使用了钥匙。键不与实体内部的任何属性相关联,它只是定位单个实体的唯一标识符。它可以是数字或字符串。在

幸运的是,除了这一行之外,所有代码看起来都很好:

fname_key = ndb.Key('Blah', lname.last_name) # which is more readable.. 

构造键需要一个唯一的ID,这与属性不同。也就是说,它不会将变量lname.last_name与属性last_name相关联。相反,您可以这样创建记录:

^{pr2}$

保证只有一个Blah实体具有该ID。实际上,如果您使用像last_name这样的字符串作为ID,则不需要将其存储为单独的属性。可以将实体ID视为唯一的额外字符串属性。在

下一步要小心,不要假设姓什么和Blah2.first_name在您的查询中是唯一的:

lname = Blah2( parent=fname_key, first_name = "Napoleon")
lname.put()

如果您不止一次这样做,将会有多个名为Napoleon的实体(都具有相同的父密钥)。在

继续上面的代码:

napol =   Blah2.query(first_name = "Napoleon")
bonakey = napol.key.parent().get() # returns Bonaparte's key ??
bona = bonakey.get() # I think this might be redundant

napol保存查询,而不是结果。您需要调用napol.fetch()来获取所有带有“Napolean”的实体(如果确定只有一个实体,则调用napol.get())。 bonakey则相反,它持有父实体是因为get()而不是Bonaparte的键。如果不关闭.get(),则bona将正确地拥有父对象。在

最后,你关于传感器的问题。您可能不需要KeyProperty或“固有”键。如果你有这样的阅读课:

class Readings(ndb.Model):
    sensor = ndb.StringProperty()
    reading = ndb.IntegerProperty()

然后,您可以将它们全部存储在一个没有键的表中。(您可能希望包含时间戳或其他属性。)稍后,您可以使用以下查询检索then:

s1_readings = Readings.query(Readings.sensor == 'S1').fetch()

相关问题 更多 >