我在 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 %}
数据存储实体定义是:
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')
最佳答案
要获取查询所表示的实体数量,您可以使用 count 方法:
db.Query(Kind).count()
您不能在 jinja 模板中执行此操作——您需要在处理程序中构建输出,然后渲染到您的模板。
然而,正如文档所说,.count() 方法“比实际检索所有结果快了一个常数因子,但运行时间仍然与偏移量 + 限制的总和成线性比例。”意思是,如果您获得大量餐厅/评论,这可能会变得非常非常缓慢。
在我看来,更好的选择是为您的餐厅模型“num_reviews”添加一个额外的属性,每次添加新评论时,您的处理程序都会更新该属性——使稍微贵一些/较慢的写入会变得非常便宜/读取速度更快,因为不需要进行额外的查询。
关于google-app-engine - 如何从客户端通过谷歌数据存储中的引用集合定义获取数据存储实体的长度(或计数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16000287/