了解 ndb 密钥类与 KeyProperty

pru*_*iap 5 python google-app-engine app-engine-ndb google-cloud-datastore

我已经浏览了文档、文档以及 SO 问题和答案,但仍在努力理解其中的一小部分。您应该选择哪个,何时选择?

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

关键类对我来说似乎很简单。当您创建 ndb 实体时,数据存储会自动为您创建一个密钥,通常采用 key(Kind, id) 的形式,其中 id 是为您创建的。

所以说你有这两个模型:

class Blah(ndb.Model):
     last_name = ndb.StringProperty()

class Blah2(ndb.Model):
     first_name = ndb.StringProperty()
     blahkey = ndb.KeyProperty()
Run Code Online (Sandbox Code Playgroud)

因此,只需使用密钥类型,您就想让 Blah1 成为父母(或有几个姓氏相同的家庭成员)

lname = Blah(last_name = "Bonaparte")
l_key = lname.put() **OR**
l_key = lname.key.id() # spits out some long id 

fname_key = l_key **OR**
fname_key = ndb.Key('Blah', lname.last_name) # which is more readable.. 
Run Code Online (Sandbox Code Playgroud)

然后:

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

lname2 = Blah2( parent=fname_key, first_name = "Lucien")
lname2.put()
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利(我认为)。现在关于 Blah2 的 KeyProperty。假设 Blah1 仍然相同。

lname3 = Blah2( first_name = "Louis", blahkey = fname_key)
lname3.put()
Run Code Online (Sandbox Code Playgroud)

这样对吗 ?

如何查询各种东西

查询姓氏:

Blah.query() # all last names
Blah.query(last_name='Bonaparte') # That specific entity.
Run Code Online (Sandbox Code Playgroud)

名:

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
Run Code Online (Sandbox Code Playgroud)

这是我迷路的地方。如何使用 key 或 keyproperty 从名字中查找 Bonaparte。我没有在这里添加它,也许应该添加,这是父母、祖父母、曾祖父母的讨论,因为 Keys 会跟踪祖先/父母。

您将如何以及为什么使用 KeyProperty 与固有的密钥类。还假设您有 3 个传感器 s1、s2、s3。每个传感器都有数千个读数,但您希望保留与 s1 相关联的读数,以便您可以用图表显示 s1 今天的所有读数。你会用哪个?KeyProperty 还是键类?如果已经在其他地方回答了这个问题,我深表歉意,但我没有看到关于选择哪个以及为什么/如何选择的明确示例/指南。

Eag*_*gle 1

我也是 NDB 的新手,目前我仍然不理解所有内容,但我认为当您使用Napoleon的父级创建Blah2时,您将需要父级来查询它,否则不会出现。例如:

napol = Blah2.query(first_name = "Napoleon")
Run Code Online (Sandbox Code Playgroud)

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

napol = Blah2.query(ancestor=fname_key).filter(Blah2.first_name == "Napoleon").get
Run Code Online (Sandbox Code Playgroud)

不知道这是否能解答您的问题。