3

我在 2 个实体(谷歌数据存储)之间有一对多的数据存储关系——即 Restaurant_Table 中的一个实例可以有来自 Review_Table 的许多评论——由集合“restaurant_reviews”标记

当我通过 jinja 遍历每家餐厅(循环)以在我的模板中列出每家餐厅时,我想显示一家餐厅的评论数量或数量。所有餐馆都以从变量餐馆中的数据存储区查询的形式从服务器传递,如我模板中的 jinja2 逻辑所示。

我收到一个错误,即查询对象 TypeError:“查询”类型的对象没有 len()。关于如何获得单个餐厅的评论数的任何其他想法?帮助!

{% for each in restaurants %}
    <script>            
     var html_output = "";
     var review_count ={{each.restaurant_reviews|length}};
    ...     
{% endfor %}

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')
4

2 回答 2

12

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

db.Query(Kind).count()

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

然而,正如文档所说, .count() 方法“比实际检索所有结果要快一个常数因子,但运行时间仍然与偏移量 + 限制的总和成线性关系。” 这意味着,如果您获得大量餐厅/评论,这可能会变得非常非常缓慢。

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

于 2013-04-14T14:57:14.923 回答
0

性能可能是一个问题,但这将完成任务:

var review_count = {% for n in restaurant_reviews %}{% if loop.index == 1 %}{{ loop.length }}{% endif %}{% endfor %};
于 2017-04-30T02:03:00.403 回答