この拡張は曲線として表すことができます。 一端には基本的なオプションがあり、簡単に記述できますが、制御オプションは制限されます。 曲線の反対側には、静的な
ORMのDjango 1.2バージョンがリリースされる前は、このような曲線は似たような外観でしたが、1つの例外がありました。最後に大きなジャンプがありました。 このジャンプは、非標準の
古い方法
Django 1.2のリリース前に、必要に応じてSQLクエリを作成するには、次のように記述する必要がありました。django.dbインポート接続から library.models import Authorから カーソル= connection.cursor() query = "SELECT * FROM library_author" cursor.execute(クエリ) 結果= cursor.fetchall() 作成者= [] 結果の結果: author = Author(*結果) authors.append(著者)
絶対にひどいものではなかったわけではありませんが、ここではSQLクエリの作成に関係のないすべてのORM機能へのアクセスを失います。 特に、クエリ結果のモデルインスタンスへの自動変換は使用できません。 もちろん、失われた機能を復元する中程度の労力を要する方法は存在しますが、実際には自転車の発明になります。
新しい方法
Django 1.2では、直接SQLクエリを作成するには、次のように記述する必要があります。library.models import Authorから query = "SELECT * FROM library_author" authors = Author.objects.raw(クエリ)
ここでの著者はRawQuerySetのインスタンスになります。 RawQuerySetはQuerySetによく似ています。 特に、類似点は、反復ごとにクエリ結果からモデルのインスタンスを返す反復可能なオブジェクトであることです。 QuerySetとは異なり、チェーンに埋め込むことができません。 ただし、リクエストは自動的に生成されないため、ここでは重要ではありません。
カーソルデータベースと同様に、クエリパラメータのセットを渡すことができ、Djangoはそれらを慎重にスクリーニングします。
query = "SELECT * FROM library_author WHERE first_name =%s" params =( 'bob'、) authors = Author.objects.raw(クエリ、パラメーター)
素晴らしい! SQLコードは攻撃から保護されています。必要なモデルのインスタンスがあり、自転車の発明はありません。
「それだけではありません!」
ほとんどのDjangoツールと同様に、raw()メソッドには、不快な状況での追加機能や特に複雑なクエリのための余地があります。独立したフィールド順序
Model.objects.raw()メソッドの場合、要求時にフィールドが返される順序は関係ありません。 重要なのは、要求フィールドの名前がモデルのフィールドに対応するかどうかだけです。#これらのクエリはすべて同じように機能します Author.objects.raw( "SELECT * FROM library_author") Author.objects.raw( "SELECT id、first_name、last_name FROM library_author") Author.objects.raw( "SELECT last_name、id、first_name FROM library_author")
注釈
クエリへの応答で、モデルクラスに存在しないフィールドを取得した場合、RawQuerysetメソッドによって返されるモデルインスタンスへの注釈として追加されます。 これにより、アクションまたは計算のすべての利点を簡単に使用でき、その実装はデータベースレベルでより効率的です。>>> authors = Author.objects.raw( "SELECT *、age(birth_date)as age FROM library_authors") >>>著者の著者: ...「%s is%s」を印刷します。 %(author.first_name、author.age) ジョンは37歳です。 ジェーンは42歳です。 ...
モデルとクエリフィールド間の関係の定義
クエリフィールドをモデルフィールドにマップするには、必要な一致を含む辞書をraw()メソッドのパラメーターの1つとして使用するだけです。 対応は、モデルのフィールドと比較できなかったフィールドについてのみ決定する必要があります。
field_map = {'first': 'first_name'、 'last': 'last_name'} query = 'SELECT id、first_name AS first、last_name as last FROM library_author' authors = Author.objects.raw(クエリ、翻訳= field_map)