1

動的モデルから 生成された 2 つ以上のテーブル ( 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でレンダリングします

表示される列の順序と、実際にどの列がレンダリングされるかを指定する場合は、以下に示すようにメタ クラスを定義します (ここで、「sequence」は列の順序です。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 に答える