1

テーブルがあり、web2py アクションがそのすべてのコンテンツをビューに渡すようにしたいと考えています。次に、ビューはそこからサブセットを選択し、反復で一度に 1 つずつマニフェストします。

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 です。プロパティ B の値を、ブロックの場所と一致する 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回続けてクエリを実行するのが正しいとは思えません。

4

1 に答える 1

0

.selectは DALSetオブジェクトのメソッドであり、オブジェクトを返します。このメソッドをオブジェクトに再度Rows適用することはできません。代わりに、オブジェクトには新しいフィルター処理されたオブジェクトを返すメソッドがあります。.selectRowsRows.findRows

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

プロパティ A 値のサブセットを Javascript で使用する場合は、テンプレートの 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 で単一のクエリを実行してサブセットを構築するよりも、必要なサブセットごとに個別のデータベース クエリを実行する方が高速になる可能性があります (特に、各サブセットがデータベース テーブルからの異なるフィールドを必要とする場合 -- そうすれば、各クエリを必要なフィールドのみに制限することができ、パフォーマンスがさらに向上します)。今は心配する必要はないかもしれませんが、パフォーマンスが問題になった場合は、プロファイリングを行って最適なアプローチを決定できます。

于 2015-07-22T14:38:02.273 に答える