gpt4 book ai didi

python - Google Appengine 一对多并按 collection_name 查询

转载 作者:行者123 更新时间:2023-12-01 06:03:17 25 4
gpt4 key购买 nike

在以下部分下:一对多 http://code.google.com/appengine/articles/modeling.html他们展示了如何建模这些关系。

class Contact(db.Model):
# Basic info.
name = db.StringProperty()
birth_day = db.DateProperty()

...

class PhoneNumber(db.Model):
contact = db.ReferenceProperty(Contact,
collection_name='phone_numbers')

...

在我看来,如果执行以下命令

scott = Contact(name='Scott')
scott.put()
PhoneNumber(contact=scott,
phone_type='home',
number='(650) 555 - 2200').put()
PhoneNumber(contact=scott,
phone_type='mobile',
number='(650) 555 - 2201').put()


for phone in scott.phone_numbers:
print '%s: %s' % (phone.phone_type, phone.number)

for phone in scott.phone_numbers:
print '%s: %s' % (phone.phone_type, phone.number)

上面的第二个for将再次查询数据存储。

如果由于某种原因你循环遍历“Scott”并调用phone_numbers,它会执行大量读取。在请求的生命周期中第一次读取时是否有某种模式可以缓存这些内容?还是需要手动处理?

发送。

最佳答案

隐式集合“phone_numbers”是通过查询构造的,缓存查询结果很棘手。很难确定哪些缓存的查询结果应因写入而失效。

一种方法可能是使用 ndb 及其缓存支持 ( http://code.google.com/p/appengine-ndb-experiment/ )。自 1.6.2 起,ndb 现已包含在 SDK 中。

ndb 不缓存查询结果,但它会缓存通过键获取的实体,因此您可以执行类似的操作来利用其缓存(其中 PhoneNumber 和 Contact 扩展 ndb.model.Model):

 phone_number = PhoneNumber(parent=contact_key, number='xxx')
phone_number.put()
....
phone_numbers = ndb.get_multi(PhoneNumber.query(ancestor=contact_key).fetch(keys_only=True))

请参阅此讨论 - 请注意以下注意事项:在 ndb 中的事务内执行查询与 key 获取:https://groups.google.com/group/appengine-ndb-discuss/browse_thread/thread/89dc6c019347b2a2/7f1db25d76515d07?lnk=gst&q=query+result+caching#7f1db25d76515d07

关于python - Google Appengine 一对多并按 collection_name 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com