Google DataStore中是否有办法使用其urlsafe密钥值批量获取实体?
我知道ndb.get_multi([list])
获取密钥列表并批量检索实体,效率更高。但在我们的例子中,我们有一个包含几百个实体的网页,其中嵌入了实体urlsafe键值。起初我们只对单个实体进行操作,因此我们能够使用urlsafe值来检索实体并执行操作而不会有太多麻烦。现在,我们需要一次更改多个实体,并逐个循环它们听起来不是一种有效的方法。有什么想法吗?
直接使用实体密钥ID(与密钥urlsafe值)是否有任何优势? documentation中的get_by_id()
并不意味着能够批量获取实体(只需一个ID)。
如果批量检索实体的唯一方法是使用实体密钥,但是,在网页上公开密钥不是推荐的方法,这是否意味着当涉及到具有分页的页面上的批量操作时,我们会陷入困境几百个实体?
答案 0 :(得分:1)
密钥和urlsafe字符串完全采用1:1的关系。如果你有一个,你可以获得另一个:
urlsafe_string = entity_key.urlsafe()
entity_key = ndb.Key(urlsafe=urlsafe_string)
因此,如果您有一堆urlsafe字符串,则可以获取相应的键,然后使用ndb.get_multi()
使用这些键获取所有实体,根据需要修改它们,然后使用ndb.put_multi()
将它们保存回数据存储区。
至于使用ID - 如果你不使用实体祖先,那只能(以方便的方式)。否则,为了获得密钥,您需要ID和实体的父密钥(或其整个祖先) - 它不方便,在这种情况下更好地使用urlsafe字符串。
但是对于没有父母的实体(在各个实体组中也称为根实体),实体密钥及其ID始终保持1:1的关系,如果您拥有另一个,则可以再获得一个:
entity_key_id = entity_key.id()
entity_key = ndb.Key(MyModel, entity_key_id)
再次从一堆ID中,您可以获得与ndb.get_multi()
和/或ndb.put_multi()
一起使用的密钥。
使用ID可以比urlsafe字符串具有美观优势 - 当它们出现在URL或页面HTML代码中时,通常会更简单,更容易:>
使用ID的另一个好处是能够拆分大型实体或以1:1的关系以更简单的方式处理实体。见re-using an entity's ID for other entities of different kinds - sane idea?
有关密钥和ID的更多信息,请参阅Creating and Using Entity Keys。