Google app engine GAE:高效查询实体及其引用的实体

Google app engine GAE:高效查询实体及其引用的实体,google-app-engine,google-cloud-datastore,app-engine-ndb,Google App Engine,Google Cloud Datastore,App Engine Ndb,我试图在模板视图中高效地返回实体列表及其各自引用的实体。比如说 我们正在处理两种类型的问题: class Event(ndb.Model): """An fun activity or event""" name = ndb.StringProperty() venue = ndb.KeyProperty() class Venue(ndb.Model): """The venue of an event""" name = ndb.StringProp

我试图在模板视图中高效地返回实体列表及其各自引用的实体。比如说

我们正在处理两种类型的问题:

class Event(ndb.Model):
    """An fun activity or event"""
    name = ndb.StringProperty()
    venue = ndb.KeyProperty()

class Venue(ndb.Model):
    """The venue of an event"""
    name = ndb.StringProperty()
    address = StringProperty()
事件
种类通过
ndb.KeyProperty()
引用
场馆
。要在模板中显示活动及其各自场馆的列表,我可以首先执行以下查询:

# we can fetch this from memcache
events = Event.query().fetch()
那么,在我看来:

{% for event in events %}
    Event Name: {{event.name}}
    Event Venue: {{event.venue.get().name}}  # is this line costly?
{% endfor %}
使用这种方法,我认为对于每个活动,都会有相应地点的
get()
调用。如果这是真的,那听起来很贵。假设有100个事件。每次页面加载都会引发100个
event.vention.get().name
请求。这意味着每天适度的10000次页面浏览将产生10000*100.get()请求。听起来对吗


这是解决这个问题的最好办法吗?如果不是,我可以考虑哪些选项?

首先,取决于数据集中的总场馆数,它们都可以很容易地安装到MimCat缓存中。因此,除非修改了场地,否则您可以连续几天不接触数据存储—无论页面浏览量有多少。确保您的场馆也使用Memcache


其次,一种更有效的检索实体的方法是在批处理请求中。循环浏览您的活动,创建一个您需要的所有场馆的列表(顺便说一句,如果多个活动发生在同一个场馆中,那么该列表可能会小于活动的数量-我看不出您的代码中有这样的检查),然后对所有场馆发出批处理请求。

以下是获取所有场馆名称的Python代码:

venue_keys = set(event.venue for event in events)
venues = ndb.get_multi(venue_keys)
venue_name = {venue.key, venue.name for venue in venues}
然后,在模板中,您可以使用:

Event Venue: {{ venue_name.get(event.venue, 'No venue') }}

你能用代码展示我在批量检索场馆后如何将每个场馆与每个活动相匹配吗?太棒了!现在我可以从memcache中检索所有活动和场地!