首页 文章

在SQLFORM中记录记录(web2py)

提问于
浏览
1

我正在尝试在web2py中创建一个由2个字段分组并计算起来的SQLFORM.grid,但我无法弄明白该怎么做 .

Model

db.define_table('invocados',
                Field('modulo_servico', 'string', label='Módulo (Serviço)', default=IS_LENGTH(2)),
                Field('servico', 'string', default=IS_LENGTH(8)),
           )

Controller

fields=(db.invocados.modulo_servico, db.invocados.servico)
Invocados=SQLFORM.grid(db.invocados.modulo_servico != db.invocados.modulo_consumidor, details=False, fields=fields, groupby=(db.invocados.modulo_servico | db.invocados.servico) , paginate=15)

我正在尝试计算按modulo_servico和servico分组的所有记录 . 我试过了:

fields=(db.invocados.modulo_servico, db.invocados.servico, db.invocados.count())

但它不起作用 .

你能帮我吗?

2 回答

  • 1

    您可以使用网格中的链接显示结果:

    SQLFORM.grid(db.invocados.modulo_servico != db.invocados.modulo_consumidor, 
        details=False, 
        fields=fields, 
        groupby=(db.invocados.modulo_servico | db.invocados.servico) , 
        paginate=15,
        links=[dict(header='Count', body=lambda row: row.modulo_servico + row.servico)])
    
  • 0

    到目前为止,我一直在使用web2py,我得出结论,最好的解决方案是返回控制器中的数据并构建一个专用视图,以便您可以按Count字段对结果进行排序,如下所示:

    Controller:

    def servexpostos():
        q = db.invocados.modulo_servico != db.invocados.modulo_consumidor
        rows = db(q).select(db.invocados.modulo_servico, db.invocados.servico, db.invocados.servico.count(), groupby=db.invocados.modulo_servico | db.invocados.servico)
        return locals()
    

    View:

    <div class="col-md-12">
    <table class="table table-striped table-hover">
        <thead>
            <tr>
                <th>Módulo</th>
                <th>Nome Implementação</th>
                <th># invocações de outros módulos</th>
            </tr>
        </thead>
        <tbody>
    {{for i,row in enumerate(rows):}}
    {{if i==items_per_page: break}}
            <tr>
                <td>{{=row.invocados.modulo_servico}}</td>
                <td>{{=row.invocados.servico}}</td>
                <td align="middle"><span class="badge">{{=row._extra['COUNT(invocados.servico)']}}</span></td>
            </tr>        
    {{pass}}
        </tbody>
    </table>
    

    这个解决方案有更多的努力,因为我不使用SQLFORM.grid,我必须控制分页,排序等(Web开发人员的常见任务)......

    更简单的方法,但不可能通过“Count”字段对结果进行排序,是使用SQLFORM.grid的links参数,并在每行中添加子查询来计算记录 .

    例:

    SQLFORM.grid(db.invocados.modulo_servico != db.invocados.modulo_consumidor, 
        details=False, 
        fields=fields, 
        groupby=(db.invocados.modulo_servico | db.invocados.servico) , 
        paginate=15,
        links=[dict(header='Count', body=lambda row: db(db.invocados.servico == row.servico).count())])
    

相关问题