对不起,如果标题不清楚,想不出一个好的方法来制定它。 目前我正在检查视图中是否没有父节点然后显示它 我想把它改成控制器(显然)
我的桌子:
db.define_table('comments',
Field('parent_id', 'reference comments', readable=False, writable=False),
Field('body', 'text', label='Message', requires=IS_NOT_EMPTY()),
auth.signature)
db.define_table('comments_users',
Field('user_id', 'reference auth_user', requires=IS_NOT_EMPTY()),
Field('comments_id', 'reference comments', requires=IS_NOT_EMPTY()),
Field('permission', 'integer', requires=IS_NOT_EMPTY()))
选择我想要的不起作用:
rows = db(
(db.comments_users.user_id==auth.user.id) &
(db.comments_users.comments_id.parent_id==0) # something like this is possible in view with a single row
).select(limitby=(0, 10))
我目前在想要更改为控制器的视图中执行此操作
{{for row in rows:}}
{{if row.comments_id.parent_id==0:}}
<td>{{=row.comments_id}}</td>
{{pass}}
{{pass}}
答案 0 :(得分:1)
首先,请注意row.comments_id.parent_id
是recursive select - 对于每一行,它会执行单独的选择,获取db.comments
标识的row.comments_id
记录。循环遍历所有记录时效率很低,因此不推荐使用。
递归选择概念不适用于查询,因此您无法像查询中那样执行db.comments_users.comments_id.parent_id == 0
。但是,您可以执行类似的操作来创建子查询:
no_parents = db.comments_users.comments_id.belongs(db.comments.parent_id == 0)
db((db.comments_users.user_id == auth.user_id) & no_parents).select(limitby(0, 10))
将belongs
方法应用于引用类型字段并传入查询时,会自动生成子查询。有关详细信息,请参阅belongs documentation。
注意,代替子查询,进行联接可能更有效(您可以检查db._timings
或使用response.toolbar()
进行调查):
db((db.comments_users.user_id == auth.user_id) &
(db.comments.parent_id == 0) &
(db.comments.id == db.comments_users.comments_id)).select(limitby(0, 10))
在这种情况下,当循环遍历行时,您需要同时引用表名和字段名(例如row.comments.id
,row.comments_users.permission
等),因为每个{ {1}}对象将包含两个表中的字段。