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

Posted

技术标签:

【中文标题】Web2py 数据库:如何从选定的行中选择行的子集?以及如何将它传递给 JavaScript?【英文标题】:Web2py databases: How do I select a subset of rows from selected rows? And how do I pass it to JavaScript? 【发布时间】:2015-10-11 14:29:39 【问题描述】:

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

这是 db.py 中的示例表:

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

控制器 default.py 中的示例操作:

def demo():
    return dict(blocks=db(db.block).select())

到目前为止一切顺利。它可以编译,不会崩溃,并且在运行了一些测试后,它达到了我想要的效果。

但现在是视图。在这个例子中,我想选择所有的“propertyA”,比如说,5。然后我想运行一个循环,将它们打印到一个已经存在的表中。该表有 100 个单元格,ID 为 1-100。我想将 propertyB 的值打印到表格单元格,其 id 与块的位置匹配。

示例视图 default/demo.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 次查询数据库服务器是正确的做法。

【问题讨论】:

您需要对 propertyA 的多个值还是单个值执行此操作?如果是后者,为什么需要将所有记录发送到视图?如果是前者,为什么不直接返回与 propertyA 的不同值匹配的记录的并集,并一次性将它们全部插入表中? 我需要多个值。每条线都有不同的值,所以不会这样做。而事实上,为什么我需要返回整个数据表并且不能一次将数据插入到 html 表中,是因为我有在表上显示不同数据的按钮。 myFunction 是一个由按钮调用的函数的示例。 【参考方案1】:

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

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

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

from gluon.serializers import json

<script>
  var subset = =json([r.propertyA for r in blocks if r.propertyA == 5])
</script>

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

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

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

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

【讨论】:

感谢您的明确答复。看起来这将解决大部分问题。有时间我会试试的。并感谢您的提示!

以上是关于Web2py 数据库:如何从选定的行中选择行的子集?以及如何将它传递给 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GridPanel 的选定行中获取值? [外网]

从datagridview中选定行的值的ID中获取名称

如何获取列表视图选定行的小部件ID

如何从 agggrid 中的选定行中删除蓝色

如何从筛选数据表 (DT) 的选定行中获取数据?

显示带有选定行的 UIPickerView