如何在Web2py中将id转换为引用字段?

时间:2016-08-11 09:14:26

标签: python web2py

考虑下面的3个表格(AB& C),其中表C有2个字段引用到表A和{{1 }}。

型号:

B

控制器:

db.define_table('A',
Field('A1', 'string', required =True),
Field('A2', 'string', required =True),
Field('A3', 'string', required =True),
format=lambda r: '%s, %s' % (r.A.A1, r.A.A2))

db.define_table('B',
Field('B1', 'string', required=True),
Field('B2', 'string', required=True),
Field('B3', 'string', required=True),
format=lambda r: '%s, %s' % (r.B.B1, r.B.B2))

db.define_table('C',
Field('C1', db.A),
Field('C2', db.B),
Field('C3', 'string', required=True),
format=lambda r: '%s, %s - %s' % (r.C.C1, r.C.C2))

在下面的相应视图中,我显示了表C的3个字段:

def C_view():
    if request.args(0) is None:
        rows = db(db.C).select(orderby=db.C.C1|db.C.C2)
    else:
        letter = request.args(0)
        rows = db(db.C.C1.startswith(letter)).select(orderby=db.C.C1|db.C.C2)
    return locals()

通过此设置,视图显示C1&amp;的外来ID。 C2。我如何修改模型,控制器和/或视图以显示相应的参考字段而不是id?换一种说法: 对于... {{ for x in rows:}} <tr> <td>{{=x.C1}}</td> <td>{{=x.C2}}</td> <td>{{=x.C3}}</td> </tr> {{pass}} ... ,视图应显示C1,对于r.A.A1, r.A.A2,视图应显示C2

谢谢。

2 个答案:

答案 0 :(得分:0)

据我所知,定义参考字段的web2py语法如下:

Field('C1', 'reference A'),
Field('C2', 'reference B'),

然后,在您看来,x.C1将是Row表格中的A对象,因此:

<td>{{=x.C1.A1}}, {{=x.C1.A2}}, {{=x.C1.A3}}</td>
<td>{{=x.C2.B1}}, {{=x.C2.B2}}, {{=x.C2.B3}}</td>

希望它有所帮助!

答案 1 :(得分:0)

您需要正确使用 format: Record representation 并使用render()将ID转换为各自的代表。

您的模型将如下所示:

db.define_table('A',
                Field('A1', 'string', required=True),
                Field('A2', 'string', required=True),
                Field('A3', 'string', required=True),
                format='%(A1)s, %(A2)s')

db.define_table('B',
                Field('B1', 'string', required=True),
                Field('B2', 'string', required=True),
                Field('B3', 'string', required=True),
                format='%(B1)s, %(B2)s')

db.define_table('C',
                Field('C1', db.A),
                Field('C2', db.B),
                Field('C3', 'string', required=True))

更新控制器并使用render()。 render()返回一个生成器来迭代所有行。

def C_view():
    if request.args(0) is None:
        rows = db(db.C).select(orderby=db.C.C1|db.C.C2).render()
    else:
        letter = request.args(0)
        rows = db(db.C.C1.startswith(letter)).select(orderby=db.C.C1|db.C.C2).render()
    return locals()

参考:

Rendering rows using represent

Format: Record representation