在以下部分中:一对多 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)
上面的第二个 将再次查询数据存储区。
如果由于某种原因你在循环“Scott”并调用phone_numbers,它将执行大量读取。在请求的生命周期中,是否有一些用于缓存这些模式的模式?还是需要手动处理?
的Tx。
答案 0 :(得分:2)
隐式集合'phone_numbers'正在通过查询构建,缓存查询结果很棘手。很难确定哪些缓存的查询结果应该因为写入而失效。
一种方法可能是使用ndb及其缓存支持(http://code.google.com/p/appengine-ndb-experiment/)。自1.6.2开始,ndb现在包含在SDK中。
ndb不会缓存查询结果,但它会缓存由key提取的实体,因此您可以执行类似这样的操作来利用其缓存(其中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中执行查询与事务内的键提取:https://groups.google.com/group/appengine-ndb-discuss/browse_thread/thread/89dc6c019347b2a2/7f1db25d76515d07?lnk=gst&q=query+result+caching#7f1db25d76515d07