合并来自django-tables2和动态模型的表

时间:2013-01-21 14:43:58

标签: python django django-tables2

我希望有可能合并两个或多个表(由django-tables2生成),这些表是从 dynamic models

首先让我描述一下我的问题:

我有以下字段用于动态生成的模型:

...
fields = {
    'colA': models.IntegerField(),
    'colB': models.IntegerField(),
    'colC': models.IntegerField(),
    'colD': models.IntegerField(),
}
...

动态处理使我可以存储我的表格,而无需定义冗余的模型类。

从数据库中存储的表派生的模型示例:

myDynamicModelA = DataModels().create_model('myDynamicModelA_tablename')
myDynamicModelB = DataModels().create_model('myDynamicModelB_tablename')
myDynamicModelC = DataModels().create_model('myDynamicModelC_tablename')
myDynamicModelD = DataModels().create_model('myDynamicModelD_tablename')
....

'_ tablename'通常由所有表共享。不同的是前缀'myDynamicModel A,B,C ......'

这是模型部分。

根据这个让我用 django-tables2 描述表结构:

每个模型/表共享一些列/字段,以便我可以像这样定义 django-tables2 类:

class Table_A(tables.Table):
    colA = tables.Column()
    colB = tables.Column()

可以使用继承来简单地处理不同的字段:

class Table_B(Table_A):
    colC = tables.Column()
    colD = tables.Column()

    def __init__(self, *args, **kwargs):
        self.colname = kwargs['colname']
        kwargs.pop('colname')
        super(Table_B, self).__init__(*args, **kwargs)
        for col in self.base_columns:
            if col not in ['colA', 'colB']:
                self.base_columns[col].verbose_name = '%s_%s' % (self.colname, col) 

正如您所看到的,构造函数为不同模型的字段提供了不同的column-name-prefix。

现在可以从不同的模型生成表格,例如:

'myDynamicModelA_tablename'的表格:

列:colA,colB,myDynamicModelA_tablename_colC,myDynamicModelA_tablename_colD

'myGenericModelB_tablename'的表格:

列:colA,colB,myDynamicModelB_tablename_colC,myDynamicModelB_tablename_colD

...

现在我的问题: 是否有可能合并两个表,以便我收到类似的东西:

colA,colB,myDynamicModelA_tablename_colC,myDynamicModelB_tablename_colC,myDynamicModelA_tablename_colD,myDynamicModelB_tablename_colD

将显示的值应该来自表之间的交集(这是可能的,因为colA的常见值,可以解释为主键

结果是 django-tables2 对象是不可靠的,因为我想提供分页和排序选项。

我希望我的描述是可以理解的,如果没有,我很抱歉。

非常感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:2)

也许我的这个question and answer会有所帮助吗?

我通过原始sql从组合动态创建的表中访问数据,并将此数据发送到Django-Tables2

如果要指定呈现的顺序以及确实呈现哪些列,请定义元类,如下所示(其中'sequence'是列的顺序; nb'...'仅表示'和所有其他列' - 查看表格2的documentary [搜索'交换列的位置']):

def getTable(table_name):
    cursor = runSQL(table_name,"""
        SELECT * FROM subscription_exptinfo,%s
        WHERE %s.id = subscription_exptinfo.id
        ;""" %(table_name,table_name)) 

    exptData = dictfetchall(cursor)

    class Meta:
        attrs = {'class': 'paleblue'}
        sequence = ('id','...')              


    attrs = {}
    attrs['Meta'] = Meta
    cols=exptData[0]

    for item in cols:
        if item=='timeStart': 
            attrs[str(item)] = tables.DateTimeColumn(format='d-m-Y g:i:s',short=False)
        else:
            attrs[str(item)] = tables.Column()


    myTable = type('myTable', (TableReport,), attrs)   

    #TableOptions(table).sequence = ["Id","..."]
    #print ".........................." + str(TableOptions(table).sequence)


    return myTable(exptData)