具有2种不同表要求的数据库

时间:2014-10-20 09:02:12

标签: database web2py

对不起,如果标题不清楚,想不出一个好的方法来制定它。 目前我正在检查视图中是否没有父节点然后显示它 我想把它改成控制器(显然)

我的桌子:

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}}

1 个答案:

答案 0 :(得分:1)

首先,请注意row.comments_id.parent_idrecursive 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.idrow.comments_users.permission等),因为每个{ {1}}对象将包含两个表中的字段。