如何通过客户端的Google数据存储区中的参考集合定义获取(或计数)数据存储区实体的长度

use*_*203 1 google-app-engine jinja2 google-cloud-datastore

我在2个实体(谷歌数据存储区)之间有1到多个数据存储关系---即,在Restaurant_Table中的一个实例可以有来自Review_Table的许多评论 - 标记为集合"restaurant_reviews"

当我通过jinja在我的模板中旋转每个餐馆(在一个循环中)到每个餐馆的列表时,我想显示单个餐馆的评论数量或数量.所有餐馆都是以可变餐厅的数据存储区中的查询形式从服务器传递的,如我模板中的jinja2逻辑所示.

我收到一个错误,查询对象TypeError:'Query'类型的对象没有len().关于如何获得单个餐厅的评价的任何其他想法?救命!

{% for each in restaurants %}
    <script>            
     var html_output = "";
     var review_count ={{each.restaurant_reviews|length}};
    ...     
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

DATASTORE ENTITY定义是:

 class Review_Table(db.Model):
   date_submission = db.DateTimeProperty(required=True, indexed=True)
   course_id = db.ReferenceProperty(Restaurant_Table, 
             indexed=True, collection_name='restaurant_reviews')
Run Code Online (Sandbox Code Playgroud)

ewe*_*ern 6

要获取查询表示的实体数,可以使用count方法:

db.Query(Kind).count()
Run Code Online (Sandbox Code Playgroud)

您不能在jinja模板中执行此操作 - 您需要在处理程序中构建输出,然后渲染到模板.

然而,正如文档所说,.count()方法"通过常数因子比实际检索所有结果更快,但运行时间仍然与偏移+限制的总和成线性比例." 这意味着,如果您有大量的餐厅/评论,这可能会非常非常慢.

在我看来,更好的选择是在您的餐厅模型"num_reviews"中添加一个额外的属性,每次添加新评论时您的处理程序都会更新 - 使得稍微更昂贵/更慢的写入会变得非常便宜/读取速度更快,因为不需要进行额外的查询.