python - django / python:複数のテーブルを持つ生のSQL

原文 python sql django

複数のテーブルで生のSQLを実行する必要があります。次に、結果セットをレンダリングします。 1つのテーブルで次のようにします。

sql = "select * from my_table"
results = my_table.objects.raw(sql)


複数のテーブルについて私はやっています:

sql = "select * from my_table, my_other_table where ...."
results = big_model.objects.raw(sql)


しかし、本当に必要なすべてのフィールドを含むテーブル/モデル/クラスbig_modelを作成する必要がありますか?この「テーブル」に実際にデータを保存することはありません。

追加:

テーブルmy_usersがあります。テーブルmy_listingsがあります。これらはModels.pyで定義されています。テーブルmy_listingsにはmy_usersへの外部キーがあり、誰がリストを作成したかを示します。

SQLは

"select user_name, listing_text from my_listings, my_users where my_users.id = my_listings.my_user_id". 


このSQLに、djangoでページをレンダリングするために使用できる結果セットを生成させたい。

問題は、フィールドuser_nameとlisting_textを含むモデルを作成する必要があるかどうかです。または、未加工のSQL(select、from、where)を使用するより良い方法はありますか?もちろん、実際のクエリはこの例よりも複雑です。 (models.pyで定義するモデルは、データベース内の実際のテーブルになるため、モデル/テーブルという用語を使用します。他にどのように参照するかわかりません。申し訳ありません。)Pythonテーブルが参照するだけであることがわかったため、生のSQLを使用します単純なデータモデルで作業します。
答え
これは機能します。なぜそれが前になかったのかわからない:( Dennis Bakerのコメントから:


すべてのフィールドを含むモデルを用意する必要はありません。最初のモデルとそこからのフィールドが必要です。一意の名前を持つフィールドが必要です。私が知る限り、「tablename.field as fieldname」を使用して、すべての一意のフィールドがあることを確認してください。この方法で5つ以上のテーブルを使用してかなり複雑なクエリをいくつか実行し、常にそれらを単一のモデルに関連付けます。 –

2。別の解決策は、カーソルを使用することです。ただし、カーソルはタプルのリストから辞書のリストに変更する必要があります。イテレータを使用するより明確な方法があると確信していますが、この関数は機能します。これは、生のSQLクエリである文字列を受け取り、テンプレートでレンダリングして使用できるリストを返します。

from django.db import connection, transaction

def sql_select(sql):
    cursor = connection.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    list = []
    i = 0
    for row in results:
        dict = {} 
        field = 0
        while True:
           try:
                dict[cursor.description[field][0]] = str(results[i][field])
                field = field +1
            except IndexError as e:
                break
        i = i + 1
        list.append(dict) 
    return list  
関連記事

python - ブレンダーは頂点ごとのUV座標をエクスポートできますか?

python - Pythonのインタラクティブ(注釈付き)チャート[終了]

python - Makoマクロのオプションとして「クラス」を使用する

python - 「pip install」と「setup.py install」での最大再帰[終了]

python - ウェルカムテキストを表示するにはどうすればよいですか?

python - 新しいインタープリターセッションを開始せずに、編集のためにIDLEで.pyファイルを開くにはどうすればよいですか?

python - Django / Pythonを使用して既存のWebサービスを利用する

python - python.socketのどの部分が、タイムアウトが設定されていても、スクリプトをいつまでもフリーズさせる可能性がありますか?

python - 隣接行列を使用したPythonでのグラフの色分け

python - 複数のテナントにわたるアカウント管理