Django — список словарей для таблиц2

боюсь, я новичок, когда дело доходит до Джанго.

У меня есть список словарей, которые я хочу использовать для заполнения Таблицы2 таблица. Я не знаю, как адаптировать список Dicts для работы в Table2 :( Сайт предлагает:

import django_tables2 as tables

data = [
    {"name": "Bradley"},
    {"name": "Stevie"},
]

class NameTable(tables.Table):
    name = tables.Column()

table = NameTable(data)

Я не могу понять это! Кроме того, я буду использовать это представление со многими различными наборами данных, поэтому мои ключи будут меняться в представлениях.

Вот пример списка словарей (обратите внимание, что ниже два словаря имеют одинаковые ключи; это всегда происходит в каждом представлении, просто в разных представлениях будут разные наборы ключей):

[{'trial2_click': u'left', 'timeStored': datetime.time(13, 35, 5), 'runOnWhatHardware': u'bla', 'id': 1L, 'timeStart': datetime.datetime(2012, 11, 2, 12, 54, 58, tzinfo=<UTC>), 'trial1_RT': 234.1, 'approxDurationInSeconds': 123L, 'timeZone': u'UTC', 'expt_id': 2L, 'trial1_click': u'right', 'trial2_RT': 2340L}, {'trial2_click': u'left', 'timeStored': datetime.time(13, 39, 15), 'runOnWhatHardware': u'bla', 'id': 2L, 'timeStart': datetime.datetime(2012, 11, 2, 12, 54, 58, tzinfo=<UTC>), 'trial1_RT': 234.1, 'approxDurationInSeconds': 123L, 'timeZone': u'UTC', 'expt_id': 2L, 'trial1_click': u'right', 'trial2_RT': 2340L}, {'trial2_click': u'left', 'timeStored': datetime.time(15, 32, 59), 'runOnWhatHardware': u'bla', 'id': 3L, 'timeStart': datetime.datetime(2012, 11, 2, 12, 54, 58, tzinfo=<UTC>), 'trial1_RT': 234.1, 'approxDurationInSeconds': 123L, 'timeZone': u'UTC', 'expt_id': 4L, 'trial1_click': u'right', 'trial2_RT': 2340L}]

Буду очень признателен за чью-либо помощь :)


person andyw    schedule 16.01.2013    source источник


Ответы (2)


решая свой собственный вопрос, я нашел здесь способ динамического создания класса во время выполнения:

Определение фабрики динамических моделей Основным принципом, который позволяет нам создавать динамические классы, является встроенная функция type(). Вместо обычного синтаксиса для определения класса в Python:

class Person(object): name = "Julia" Функцию type() можно использовать для создания того же класса, вот как класс выглядит с использованием встроенной функции type():

Person = type("Person", (object,), {'name': "Julia"}) Использование type() означает, что вы можете программно определить количество и имена атрибутов, составляющих класс.

и мой рабочий код:

 def getTable(table_name):
    cursor = connection.cursor()
    try:
        cursor.execute("""SELECT * FROM %s,%s;""" %(table_name,'subscription_exptinfo')) # want autoincrement key?
        exptData = dictfetchall(cursor)
    except Exception, e:
        ''      

    attrs = {}
    cols=exptData[0]

    for item in cols:
        attrs[str(item)] = tables.Column()

    myTable = type('myTable', (tables.Table,), attrs)        

    return myTable(exptData)

def dictfetchall(cursor):
    "Returns all rows from a cursor as a dict"
    desc = cursor.description
    return [
        dict(zip([col[0] for col in desc], row))
        for row in cursor.fetchall()
    ]   
person andyw    schedule 21.01.2013

Создайте подкласс Table для каждого типа таблицы, которую вы хотите отобразить. Под типом я подразумеваю набор столбцов. Например:

import datetime
import django_tables2 as tables

[
    {'trial2_click': u'left', 'timeStored': datetime.time(13, 35, 5), 'runOnWhatHardware': u'bla', 'id': 1L, 'timeStart': datetime.datetime(2012, 11, 2, 12, 54, 58), 'trial1_RT': 234.1, 'approxDurationInSeconds': 123L, 'timeZone': u'UTC', 'expt_id': 2L, 'trial1_click': u'right', 'trial2_RT': 2340L},
    {'trial2_click': u'left', 'timeStored': datetime.time(13, 39, 15), 'runOnWhatHardware': u'bla', 'id': 2L, 'timeStart': datetime.datetime(2012, 11, 2, 12, 54, 58), 'trial1_RT': 234.1, 'approxDurationInSeconds': 123L, 'timeZone': u'UTC', 'expt_id': 2L, 'trial1_click': u'right', 'trial2_RT': 2340L},
    {'trial2_click': u'left', 'timeStored': datetime.time(15, 32, 59), 'runOnWhatHardware': u'bla', 'id': 3L, 'timeStart': datetime.datetime(2012, 11, 2, 12, 54, 58), 'trial1_RT': 234.1, 'approxDurationInSeconds': 123L, 'timeZone': u'UTC', 'expt_id': 4L, 'trial1_click': u'right', 'trial2_RT': 2340L}
]

class TrialTable(tables.Table):
    trial2_click = tables.Column()
    timeStored = tables.TimeColumn()
    runOnWhatHardware = tables.Column()
    timeStart = tables.DateTimeColumn()
    trial1_RT = tables.Column()
    approxDurationInSeconds = tables.Column()
    timeZone = tables.Column()
    expt_id = tables.Column()
    trial1_click = tables.Column()
    trial2_RT = tables.Column()
person bradley.ayers    schedule 17.01.2013
comment
Спасибо за вашу помощь :) . Проблема в том, что у меня могут быть тысячи+ таких подклассов. Есть ли способ динамически создать такой подкласс? Кроме того, я пытался создать демонстрационный класс, похожий на TrialTable, но когда я передаю его в Table2, Table2 жалуется, что TrialTable не является QuerySet или Table. Кажется, меня осаждают на каждом шагу! - person andyw; 18.01.2013