2011-10-17 31 views
0

複数のテーブルでraw SQLを実行する必要があります。結果セットをレンダリングします。私はどうなるのテーブルの場合:複数のテーブルに対してdjango/python:複数のテーブルを持つraw sql

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は、私は、このSQLは、私はジャンゴで私のページをレンダリングするために使用することができ、結果セットを生成したい

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

です。

質問は次のとおりです。フィールドuser_nameとlisting_textを含むモデルを作成する必要がありますか?または、未処理のSQL(select、from、where)を使用する、より良い方法がいくつかありますか?もちろん、実際のクエリはこの例より複雑です。 (私がmodels.pyで定義したモデルは、データベースの実際のテーブルとなり、モデル/テーブルの用語を使用しています。それらを参照する方法が他にありません、ごめん。)私はPythonテーブル参照単純なデータモデルで作業します。

+0

あなたがここで達成しようとしていることは明確ではありません。おそらく、あなたのモデルについてより詳細な情報を表示し、このクエリが行うことが役立つと思われるかもしれません。 –

+0

テーブルが外部キーによって結合されている複数のテーブルから選択したいです。私は実際のクエリを書く助けは必要ありません。申し訳ありませんが、なぜそれが明確でないのか分かりません:( – user984003

+0

あなたはクエリのヘルプが必要なようです。私はDjangoでこれを行うには、生のSQLが必要だと思う理由はよく分かりません。 –

答えて

1
  1. これは機能します。 Dennis Bakerのコメントから:

すべてのフィールドを含むモデルを持つ必要はありません。最初のモデルとフィールドだけが必要です。私はあなたがすべての一意のフィールドを持っていることを確認するために "tablename.fieldをfieldnameとして"使用するべきであることを知っている限り、私は5+テーブルでかなり複雑なクエリをやってきました。 1つのモデルに戻します。 -

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 
+0

カーソルを使用する場合、どのように各行をモデルにマップするのですか?私はDjangoに全く新しいです。 djangoサーバはモデルインスタンスをキャッシュしますが、基本的にデータベースからデータを複製していますか?本番環境でAPIがヒットしたら、そのデータはキャッシュされたモデルデータから来るのですか、または毎回カーソルオブジェクトが実行されますか?ありがとうございました! –

0

raw SQLから戻すフィールドを含むモデルは必要ありません。実際にraw SQLから返すフィールドがあるモデルがある場合は、生のSQL出力をこのモデルにマップすることができます。そうしないと、cursorsを使用してモデルを完全に移動できます。

+0

https://docs.djangoproject.com/en/dev/topics/db/sql/のドキュメントでは、「raw()はクエリのフィールドをモデルのフィールドに自動的にマップします」と記載されています。これは、少なくともクエリのフィールドを含むモデルが必要であることを示しています。クエリは2つのテーブルのフィールドを生成するので、これらのフィールドを含む3番目のモデルを持つ必要がありますか?これが私が避けたいと思っているものです。 – user984003

+0

問題を理解するのにはしばらく時間がかかりました:)これは非常に良い質問です。私はこの領域では、djangoが非常に欠けていると思います。私は私の答えを変えました。 – akonsu

+0

すべてのフィールドを含むモデルを持つ必要はありません。最初のモデルとフィールドだけが必要です。あなたは一意の名前のフィールドを持つ必要があります。あなたがすべての一意のフィールドを持っていることを確認するために、 "tablename.field as fieldname"を使うべきであることがわかっている限り、私はこのように5+のテーブルでかなり複雑なクエリを実行し、それらを常に単一のモデルに戻します。 –

関連する問題