Google Appengine One To Many并通过collection_name查询

时间:2012-02-13 03:05:59

标签: python google-app-engine datastore

在以下部分中:一对多 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。

1 个答案:

答案 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