1

我希望有可能合并从 动态模型生成的两个或多个表(由django-tables2生成) 。

先说一下我的问题:

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

...
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) 

如您所见,构造函数为模型中不同的字段提供了不同的列名前缀。

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

'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对象是必要的,因为我想提供分页和排序选项。

我希望我的描述是可以理解的,如果没有,对不起。

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

4

1 回答 1

2

也许我的这个上一个问题和答案会有所帮助?

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

如果您想指定渲染列的顺序和实际呈现的列,请定义一个元类,如下所示(其中“序列”是列的顺序;nb '...' 仅表示“和所有其他列” - 检查出Tables2的纪录片[搜索'交换列的位置']):

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)
于 2013-01-30T07:48:20.433 回答