- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经查看了文档、文档和 SO 问题和答案,但仍在努力理解其中的一小部分。您应该选择哪个以及何时选择?
这是我到目前为止读过的内容(只是示例):
关键类对我来说似乎很简单。当您创建一个 ndb 实体时,数据存储会自动为您创建一个 key ,通常采用 key(Kind, id) 的形式,其中为您创建了 id。
假设您有这两个模型:
class Blah(ndb.Model):
last_name = ndb.StringProperty()
class Blah2(ndb.Model):
first_name = ndb.StringProperty()
blahkey = ndb.KeyProperty()
因此,只需使用 key 类型,您就可以让 Blah1 成为 parent (或有多个姓氏相同的家庭成员)
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..
然后:
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
这就是我迷路的地方。如何使用键或键属性从名字中查找 Bonaparte。我没有在这里添加它,也许应该添加它,这是 parent 、祖 parent 、曾祖 parent 的讨论,因为 Keys 跟踪祖先/ parent 。
与固有 key 类相比,您将如何以及为何使用 KeyProperty。还假设您有 3 个传感器 s1、s2、s3。每个传感器都有数以千计的读数,但您希望将读数与 s1 相关联,以便您可以用图表表示今天 s1 的所有读数。你会用哪个? KeyProperty 还是关键类?如果这个问题在其他地方得到了回答,我深表歉意,但我没有看到关于选择哪个以及为什么/如何选择的明确示例/指南。
最佳答案
我认为混淆来自使用 key 。 Key 不与实体内部的任何属性相关联,它只是定位单个实体的唯一标识符。它可以是数字或字符串。
幸运的是,除了这一行之外,您的所有代码看起来都不错:
fname_key = ndb.Key('Blah', lname.last_name) # which is more readable..
构造一个 Key 需要一个唯一的 ID,这与属性不同。也就是说,它不会将变量 lname.last_name
与属性 last_name
相关联。相反,您可以像这样创建记录:
lname = Blah(id = "Bonaparte")
lname.put()
lname_key = ndb.Key('Blah', "Bonaparte")
您保证只有一个 Blah 实体具有该 ID。事实上,如果您使用像 last_name 这样的字符串作为 ID,则无需将其存储为单独的属性。将实体 ID 视为唯一的额外字符串属性。
接下来,注意不要假设 Blah.last_name 和 Blah2.first_name 在您的查询中是唯一的:
lname = Blah2( parent=fname_key, first_name = "Napoleon")
lname.put()
如果您多次执行此操作,将会有多个实体的 first_name 为 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 的 key 。如果您关闭 .get(),那么 bona
将正确地拥有父级。
最后,关于传感器的问题。您可能不需要 KeyProperty 或“固有” key 。如果您有这样的阅读课:
class Readings(ndb.Model):
sensor = ndb.StringProperty()
reading = ndb.IntegerProperty()
然后您可以将它们全部存储在一个没有键的表中。 (您可能希望包括时间戳或其他属性。)稍后,您可以使用此查询检索 then:
s1_readings = Readings.query(Readings.sensor == 'S1').fetch()
关于python - 了解 ndb 键类与 KeyProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16020686/
我有这两个模型: ################# ### Usergroup ### ################# class Usergroup(ndb.Model): group
我在理解实体和键在 Google App Engine NDB 中的工作方式时遇到一些问题。 我有一个 post 实体和一个 user 实体。如何将 post 上的 user_key 设置为 user
我有两个模型: class User(ndb.Model): email = ndb.StringProperty(required=True) name = ndb.StringPr
众所周知,应用引擎中的 keys_only 查询速度很快。 Google App Engine 现在可以运行“投影查询”,它可以只返回部分实体数据 https://developers.google.
我试图通过使用将字符串转换为相应类型的 Key 的自定义验证器来简化 ndb KeyProperties 的 JSON 序列化和反序列化。 想法是拥有这样的属性: def key_validator(
我刚刚开始使用 AppEngine 并使用 endpoints_proto_datastore 库。我的问题:当我尝试列出特定播放列表的所有 PlaylistItems 时,查询路径中的“播放列表”参
我已经查看了文档、文档和 SO 问题和答案,但仍在努力理解其中的一小部分。您应该选择哪个以及何时选择? 这是我到目前为止读过的内容(只是示例): ndb documentation movie dat
是否可以根据 KeyProperty 的祖先(父级)进行查询? EG,类似于以下内容: class Foo(ndb.Model): bar = ndb.KeyProperty() Foo.qu
我有一个简单的ndb模型如下: class TaskList(ndb.Model): title = ndb.StringProperty() description = ndb.Te
我有一些共享一组公共(public)属性的模型,我在其他模型继承的基本模型类中定义了这些属性: class BaseUser(ndb.Model): name = ndb.StringProp
在 AppEngine 的 NDB 数据存储中,似乎有两种方法可以将对象相互关联起来。有 ndb.KeyProperty 和 parents/ancestors keys .我对什么时候应该使用一个或
我有一个简单的场景,其中有一个 User 类,它具有 name、email 和 followers 属性。 class User(ndb.Model): name = ndb.StringPr
我正在尝试开发一个应用程序,其中 Student 实体通过它们的键添加到 Class 实体。所以在类里面,我可以有一个 List 的学生,可以通过他们的键来识别,这些键可以是 Integer 或 St
我正在使用 flask-appengine-template来自 kamalgill,我遇到了一个奇怪的问题。 我的 models.py 文件如下所示: from google.appengine.e
假设一个 NDB(版本 0.7 和 0.8)模型,其键可以是 None: class Test(model.Model): k = model.KeyProperty() value
ReferenceProperty 在处理两个模块之间的引用方面非常有帮助。狐狸例子: class UserProf(db.Model): name = db.StringProperty(r
有关于如何set的帖子, get , KeyProperty/StructuredProperty ,但没有任何内容告诉我如何使用 NDB 进行多对一建模。 我有两个模型: class Departm
我的问题是关于在 ndb 中建模一对多关系。我知道这可以通过(至少)两种不同的方式来完成:使用重复的属性或使用“外键”。我在下面创建了一个小例子。基本上我们有一篇文章可以有任意数量的标签。假设可以删除
我是一名优秀的程序员,十分优秀!