2015-07-21 49 views
1

我有一個表,並希望web2py操作傳遞其視圖的所有內容。該視圖然後從中選擇一個子集並在迭代中一次一個地顯示它們。Web2py數據庫:如何從選定行中選擇行的子集?我如何將它傳遞給JavaScript?

下面是一個示例表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與塊的位置相匹配。

樣本視圖默認/ 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次是正確的。

+0

您是否需要爲propertyA的多個值或只是一個值執行此操作?如果是後者,爲什麼你需要將所有記錄發送到視圖?如果前者,爲什麼不只是返回與propertyA的不同值相匹配的記錄的聯合,並將它們全部插入到表中一次傳遞? – Anthony

+0

我需要多個值。每一行都有不同的值,所以人們不會這樣做。事實上,爲什麼我需要返回整個數據表,並且無法一次將數據插入到html表中,這是因爲我的按鈕在表上顯示不同的數據。 myFunction是按鈕調用的一個函數的示例。 – DiMarzio

回答

0

.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(尤其是如果每個子集都需要數據庫表中的不同字段 - 這樣您可以將每個查詢限制爲僅需要的字段,這將進一步提高性能)。現在可能不值得擔心,但如果性能成爲問題,則可以通過一些分析來確定最佳方法。

+0

謝謝您的確切答案。看起來這將主要解決所有問題。一旦我有時間,我會嘗試。並感謝提示! – DiMarzio

相關問題