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

1 投票
1 回答
1392 浏览
提问于 2025-04-17 13:18

我想要一个功能,可以把两个或多个表合并在一起,这些表是通过 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 对象,因为我想提供分页和排序的选项。

希望我的描述能让你明白,如果不清楚我很抱歉。

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

1 个回答

2

也许我之前的这个问题和回答能帮到你?

我通过原始SQL访问动态创建的表中的数据,然后把这些数据发送到Django-Tables2进行渲染。

如果你想指定显示的列的顺序和具体哪些列被显示,可以像下面这样定义一个Meta类(其中'顺序'表示列的排列顺序;注意'...'只是表示'其他所有列' - 可以查看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)

撰写回答