2015-07-21 1 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 ячеек, а идентификаторы - 1-100. Я хочу напечатать значения свойстваB в ячейках таблицы, чей идентификатор соответствует местоположению блоков.

Вид выборки по умолчанию/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 или только одного значения? Если последнее, зачем вам нужно отправлять все записи в представление? Если первое, почему бы просто не вернуть объединение записей, которые соответствуют различным значениям свойства А и вставить их все в таблицу за один проход? – Anthony

+0

Мне нужно несколько значений. Каждая строка имеет разные значения, поэтому ее не было бы. И тот факт, почему мне нужно вернуть всю таблицу данных и не может сразу вставить данные в таблицу html, потому что у меня есть кнопки, которые показывают разные данные в таблице. myFunction - это пример одной функции, вызываемой кнопкой. – DiMarzio

ответ

0

.select является методом объекта DAL Set и возвращает Rows объект - вы не можете применить метод .select снова к Rows объекта. Вместо этого Rows объект имеет .find метод, который возвращает новый отфильтрованный Rows объект:

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

Если вы хотите использовать подмножество значений propertyA в 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.

Также обратите внимание на то, что, поскольку для генерации списка значений свойстваA используется представление списка, можно использовать предложение if для фильтрации записей, а не с использованием метода .find.

Как правило, лучше всего минимизировать количество логики Python в представлениях (сложнее читать, отлаживать и тестировать), поэтому было бы лучше создать все массивы JSON в контроллере и просто передать их на Посмотреть.

Кроме того, если количество записей в blocks велико, то фильтрация на Python может быть медленной, поэтому может потребоваться более быстрое выполнение отдельных запросов к базе данных для каждого необходимого подмножества, вместо того чтобы делать один запрос и строить подмножества из что исключительно в Python (особенно если для каждого подмножества требуются разные поля из таблицы базы данных - таким образом, вы можете ограничить каждый запрос только требуемыми полями, что еще больше повысит производительность).Возможно, сейчас не стоит беспокоиться, но если производительность становится проблемой, вы можете сделать некоторые профилирования, чтобы определить лучший подход.

+0

Благодарим вас за окончательный ответ. Похоже, это решит в основном все. Я попробую, как только у меня будет время. И спасибо за советы! – DiMarzio

 Смежные вопросы

  • Нет связанных вопросов^_^