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?的主要内容,如果未能解决你的问题,请参考以下文章