Web2py数据库:如何从选定的行中选择子集?如何将其传递给JavaScript?

2024-09-29 23:16:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表,希望web2py操作传递视图的所有内容。然后视图从中选择一个子集,并在迭代中一次显示一个子集。在

这是一张数据库公司名称:

db.define_table('block',
    Field('location'),
    Field('propertyA'),
    Field('propertyB')
)

控制器中的一个示例操作默认.py公司名称:

^{pr2}$

到目前为止还不错。它可以编译,不会崩溃,在运行了一些测试之后,它做了我想要的。在

但现在来看一下。在本例中,我想选择“propertyA”为5的所有对象。然后我要运行一个循环,将它们打印到一个表中,这个表已经存在。表格有100个单元格,id为1-100。我想将propertyB的值打印到表单元格,其id与块的位置相匹配。在

示例视图默认值/演示.html公司名称:

{{extend 'layout.html'}}

<style>
    table#map, td {
        border: 1px solid black;
        border-collapse: collapse;
    }
    td {
        background-color: gray;
        width: 50px;
        height:50px;
        text-align: center;
        color: white;
    }
</style>

<!--This creates a 10*10 table with running id from 1 to 100-->
<table id="map">
    <caption>Map</caption>
    {{for y in range(10):}}
    <tr>
        {{for x in range(10):}}
        {{=TD('', _id=10*y+x)}}
        {{pass}}
    </tr>
    {{pass}}
</table>

<!--then I want to select a subset from blocks, whose propertyA is 5
These lines crash if uncommented.-->
{{#query = (propertyA == 5)}}
{{#subset = blocks(query).select()}}

<!--and run a loop which, which iterates the subset, and in each
iteration, writes the value of propertyB, if cell's id and block's location
match. I just made a place holder function, because I don't know how to
pass python variables/objects to javascript-->
<script>
    //var subset = "subset from python";
    function myFunction() {
        var i;
        for (i = 0; i < 100; i++) {
            //var cell = document.getElementById(i);
            //if(subset(location===cell.id).select() === True) {
                //var value = subset(location===cell.id).propertyB;
                //cell.innerHTML = value;
            //} else {
                //cell.innerHTML = '';
            //}
        }
    }
</script>

所以我不知道该怎么做。而web2py教程书对这方面的信息非常吝啬。还是我对这件事的态度完全错误?因为我认为也可以用ajax调用来完成,但我不认为连续100次对数据库服务器进行查询是正确的。在


Tags: tofrom名称视图idfieldforvar
1条回答
网友
1楼 · 发布于 2024-09-29 23:16:23

.select是DAL Set对象的一个方法,并返回一个Rows对象,然后不能将.select方法再次应用于Rows对象。相反,Rows对象有一个^{}方法,它返回一个新的过滤后的Rows对象:

blocks.find(lambda row: row.propertyA == 5)

如果要在Javascript中使用propertyA值的子集,则需要在模板中将其写入Javascript代码。首先,必须将每行中的各个值提取到一个列表中,然后将其转换为JSON,以便将其用作Javascript变量:

^{pr2}$

这里我们只需使用模板分隔符({{ }})将Python代码的结果直接写入Javascript代码,以便定义subset变量的值。在

另外,请注意,因为列表理解用于生成propertyA值的列表,所以可以使用if子句来过滤记录,而不是使用.find方法。在

通常最好将视图中Python逻辑的数量减到最少(更难读取、调试和测试),因此最好在控制器中创建所有JSON数组并将它们传递给视图。在

另外,如果blocks中的记录数量很大,那么Python中的过滤可能会很慢,因此,对每个需要的子集执行单独的数据库查询可能会更快,而不是纯粹在Python中执行单个查询并从中构建子集(特别是如果每个子集都需要数据库表中不同的字段)您可以将每个查询限制为所需的字段,这将进一步提高性能)。也许现在不值得担心,但是如果性能成为一个问题,您可以进行一些分析来确定最佳方法。在

相关问题 更多 >

    热门问题