2013-01-21 14 views
1

我想合併兩個或多個表(由django-tables2生成)從 dynamic models生成的可能性。從django-tables2和動態模型合併表

讓我先說明我的問題:

我有一個動態生成的模型以下字段:

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

的動態操控給我的可能性來存儲我的表structered,但沒有界定冗餘模式類。

用於從數據庫中存儲的表中派生模型

實施例:

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

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

它們是不同的字段可以簡單地通過使用繼承來處理

如您所見,構造函數爲模型中不同的字段提供了不同的列名前綴。

現在可以生成從不同的模型,如表:

表 'myDynamicModelA_tablename':

列:可樂,COLB,myDynamicModelA_tablename_colC,myDynamicModelA_tablename_colD

表'myGenericModelB_tablename':

列:colA,colB,myDynamicModelB_ta blename_colC,myDynamicModelB_tablename_colD

...

現在我的問題: 是可以讓我得到類似的東西兩個表合併:

可樂,COLB,myDynamicModelA_tablename_colC,myDynamicModelB_tablename_colC,myDynamicModelA_tablename_colD,myDynamicModelB_tablename_colD

將顯示值應(這是可能的,因爲來自colA的共同值,其可以被解釋爲主鍵

它是nessecary,結果是一個django-tables2對象,因爲我想提供分頁和排序選項。

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

非常感謝您的時間和幫助。

回答

2

也許這個prev question and answer我的會幫忙嗎?

我從通過原始SQL結合動態創建的表訪問數據,並且如果你想指定的順序和確實的列被渲染,定義一個元類發送這個數據在Django的Tables2

被渲染如下所示(其中'sequence'是列的順序; nb'...'只是表示'和所有其他列') - 檢查表012的[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)