合并django-tables2和动态模型的表格
我想要一个功能,可以把两个或多个表合并在一起,这些表是通过 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 个回答
也许我之前的这个问题和回答能帮到你?
我通过原始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)