{"title":"クエリ式 (Query Expression)","version":"5.2","locale":"ja","docname":"ref/models/expressions","url":"/ja/5.2/ref/models/expressions/","canonical":"https://djangodocs.dev/ja/5.2/ref/models/expressions/","summary":"クエリ式 (query expression) は、update、create、filter、order by、annotation、またはaggregateの一部として使用できる値または計算を記述します。","html":"<h1>クエリ式 (Query Expression)<a class=\"heading-anchor\" href=\"#query-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>クエリ式 (query expression) は、update、create、filter、order by、annotation、またはaggregateの一部として使用できる値または計算を記述します。式が真偽値を出力する場合、フィルタで直接使用できます。クエリの記述に使用できる組み込みの式 (expression) は多数あります (以下で説明します)。式を組み合わせたり、場合によっては入れ子にしてより複雑な計算を行うこともできます。</p>\n<section id=\"supported-arithmetic\">\n<h2>サポートされている算術演算<a class=\"heading-anchor\" href=\"#supported-arithmetic\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は Python の定数や変数、そして他の式を使って、クエリ式での否定、 加算、減算、乗算、除算、モジュロ演算、そしてべき乗演算をサポートします。</p>\n</section>\n<section id=\"output-field\">\n<span id=\"id1\"></span><h2>出力フィールド (<code class=\"docutils literal notranslate\">output_field</code>)<a class=\"heading-anchor\" href=\"#output-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>このセクションで説明する式の多くは、オプションの <code class=\"docutils literal notranslate\">output_field</code> パラメータをサポートしています。指定された場合、 Django はデータベースから値を取得した後、そのフィールドに値を読み込みます。</p>\n<p><code class=\"docutils literal notranslate\">output_field</code> は <code class=\"docutils literal notranslate\">IntegerField()</code> や <code class=\"docutils literal notranslate\">BooleanField()</code> のようなモデルフィールドのインスタンスを取ります。通常、フィールドには <code class=\"docutils literal notranslate\">max_length</code> のような引数は不要です。フィールドの引数はデータの検証に関連しており、その検証は式の出力値に対して実行されないからです。</p>\n<p><code class=\"docutils literal notranslate\">output_field</code> が必要なのは、フィールド型が混在する複雑な式のように、 Django が結果のフィールド型を自動的に判断できない場合だけです。例えば、 <code class=\"docutils literal notranslate\">DecimalField()</code> と <code class=\"docutils literal notranslate\">FloatField()</code> を足す場合、 <code class=\"docutils literal notranslate\">output_field=FloatField()</code> のように出力フィールドが必要になります。</p>\n<p><code class=\"docutils literal notranslate\">output_field</code> also allows using custom fields that perform type conversions\noutside a specific model field context. For example, if you frequently need to\nperform date arithmetic with <code class=\"docutils literal notranslate\">timedelta</code>, you can create a custom field that\nhandles the conversion, ensuring consistent results across databases. See\n<a class=\"reference internal\" href=\"/ja/5.2/howto/custom-model-fields/\"><span class=\"doc\">カスタムのモデルフィールドを作成する</span></a>.</p>\n</section>\n<section id=\"some-examples\">\n<h2>例<a class=\"heading-anchor\" href=\"#some-examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Count<span class=\"p\">,</span> F<span class=\"p\">,</span> Value\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Length<span class=\"p\">,</span> Upper\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.lookups</span> <span class=\"kn\">import</span> GreaterThan\n\n<span class=\"go\"># Find companies that have more employees than chairs.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n\n<span class=\"go\"># Find companies that have at least twice as many employees</span>\n<span class=\"go\"># as chairs. Both the querysets below are equivalent.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)</span> <span class=\"o\">*</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n\n<span class=\"go\"># How many chairs are needed for each company to seat all employees?</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company <span class=\"o\">=</span> <span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>num_employees__gt<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span>annotate<span class=\"p\">(</span>chairs_needed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">)</span> <span class=\"o\">-</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span>    <span class=\"o\">.</span>first<span class=\"p\">()</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>num_employees\n<span class=\"go\">120</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>num_chairs\n<span class=\"go\">50</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>chairs_needed\n<span class=\"go\">70</span>\n\n<span class=\"go\"># Create a new company using expressions.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Google&quot;</span><span class=\"p\">,</span> ticker<span class=\"o\">=</span>Upper<span class=\"p\">(</span>Value<span class=\"p\">(</span><span class=\"s2\">&quot;goog&quot;</span><span class=\"p\">)))</span>\n<span class=\"go\"># Be sure to refresh it if you need to access the field.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>refresh_from_db<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>company<span class=\"o\">.</span>ticker\n<span class=\"go\">&#39;GOOG&#39;</span>\n\n<span class=\"go\"># Annotate models with an aggregated value. Both forms</span>\n<span class=\"go\"># below are equivalent.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_products<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;products&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_products<span class=\"o\">=</span>Count<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;products&quot;</span><span class=\"p\">)))</span>\n\n<span class=\"go\"># Aggregates can contain complex computations also</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>num_offerings<span class=\"o\">=</span>Count<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;products&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;services&quot;</span><span class=\"p\">)))</span>\n\n<span class=\"go\"># Expressions can also be used in order_by(), either directly</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>Length<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>asc<span class=\"p\">())</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>Length<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">())</span>\n<span class=\"go\"># or using the double underscore lookup syntax.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> CharField\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Length\n<span class=\"gp\">&gt;&gt;&gt; </span>CharField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>Length<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;name__length&quot;</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Boolean expression can be used directly in filters.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Exists<span class=\"p\">,</span> OuterRef\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Exists<span class=\"p\">(</span>Employee<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>company<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">),</span> salary__gt<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n\n<span class=\"go\"># Lookup expressions can also be used directly in filters</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>GreaterThan<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)))</span>\n<span class=\"go\"># or annotations.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    need_chairs<span class=\"o\">=</span>GreaterThan<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"built-in-expressions\">\n<h2>組み込みのクエリ式<a class=\"heading-anchor\" href=\"#built-in-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>これらの式は <code class=\"docutils literal notranslate\">django.db.models.expressions</code> と <code class=\"docutils literal notranslate\">django.db.models.aggregates</code> で定義されていますが、利便性のために <a class=\"reference internal\" href=\"/ja/5.2/topics/db/models/#module-django.db.models\" title=\"django.db.models\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.models</code></a> からインポートできます。</p>\n</aside>\n<section id=\"f-expressions\">\n<h3><code class=\"docutils literal notranslate\">F()</code> 式<a class=\"heading-anchor\" href=\"#f-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.F\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">F</span><a class=\"heading-anchor\" href=\"#django.db.models.F\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">F()</code> オブジェクトはモデルフィールドの値、モデルフィールドを変換した値、アノテーションを付けた列を表します。これを使うことで、実際にデータベースから Python のメモリに取り出さずに、モデルフィールドの値を参照してデータベース操作を行うことができます。</p>\n<p>代わりに、 Django は <code class=\"docutils literal notranslate\">F()</code> オブジェクトを使って、データベースレベルで必要な操作を記述する SQL 式を生成します。</p>\n<p>例でやってみましょう。通常はこのようにします：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Tintin filed a news story!</span>\nreporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\nreporter<span class=\"o\">.</span>stories_filed <span class=\"o\">+=</span> <span class=\"mi\">1</span>\nreporter<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>ここでは、<code class=\"docutils literal notranslate\">reporter.stories_filed</code> の値をデータベースからメモリに取り込んで、Pythonでおなじみの演算子を使って操作し、そのオブジェクトをデータベースに保存しています。しかし、代わりに次のようにすることもできます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n\nreporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\nreporter<span class=\"o\">.</span>stories_filed <span class=\"o\">=</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\nreporter<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">reporter.stories_filed = F('stories_filed') + 1</code> はインスタンス属性に値を代入する普通の Python 構文のように見えますが、実際にはデータベースに対する操作を記述するSQL構文です。</p>\n<p>Djangoが <code class=\"docutils literal notranslate\">F()</code> インスタンスを見つけると、標準のPython演算子をオーバーライドしてカプセル化されたSQL式を作成します。この場合、<code class=\"docutils literal notranslate\">reporter.stories_filed</code> によって表されるデータベースフィールドをインクリメントするようにデータベースに指示する式が作成されます。</p>\n<p><code class=\"docutils literal notranslate\">reporter.stories_filed</code> にどんな値があったとしても、Pythonはそれを知ることはありません。それは完全にデータベースが扱います。Python が Django の <code class=\"docutils literal notranslate\">F()</code> クラスを通して行うことは、フィールドを参照し、処理を記述する SQL 構文を作成することだけです。</p>\n<p>このようにして保存された新しい値にアクセスするには、オブジェクトをリロードする必要があります：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>reporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span>reporter<span class=\"o\">.</span>pk<span class=\"p\">)</span>\n<span class=\"c1\"># Or, more succinctly:</span>\nreporter<span class=\"o\">.</span>refresh_from_db<span class=\"p\">()</span>\n</code></pre></div>\n<p>上記のように単一インスタンスに対する操作で使用できるだけでなく、<code class=\"docutils literal notranslate\">F()</code> は <code class=\"docutils literal notranslate\">update()</code> と組み合わせて <code class=\"docutils literal notranslate\">QuerySet</code> に対する一括更新を実行するためにも使用できます。これにより、先ほど使用していた 2 つのクエリ、 <code class=\"docutils literal notranslate\">get()</code> と <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> を1 つに減らせます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>reporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\nreporter<span class=\"o\">.</span>update<span class=\"p\">(</span>stories_filed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>また、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\">update()</code></a> を使用して複数のオブジェクトのフィールド値をインクリメントすることもできます。これは、データベースからPythonに全てを引き出し、それら全てをループ処理し、各オブジェクトのフィールド値をインクリメントし、そして各オブジェクトをデータベースに保存するよりも、はるかに高速になる可能性があります：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>Reporter<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>stories_filed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>つまり、<code class=\"docutils literal notranslate\">F()</code> は、以下のようなパフォーマンス上の利点があります：</p>\n<ul class=\"simple\">\n<li><p>作業をPythonではなく、データベースに行わせること</p></li>\n<li><p>一部の操作に必要なクエリの数を減らすこと</p></li>\n</ul>\n<section id=\"slicing-f-expressions\">\n<span id=\"slicing-using-f\"></span><h4><code class=\"docutils literal notranslate\">F()</code> 式のスライス<a class=\"heading-anchor\" href=\"#slicing-f-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"5.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<p>文字列ベースのフィールド、テキストベースのフィールド、および <a class=\"reference internal\" href=\"/ja/5.2/ref/contrib/postgres/fields/#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> では、Python の配列スライス構文が使用できます。インデックスは0から始まります。 <code class=\"docutils literal notranslate\">slice</code> の <code class=\"docutils literal notranslate\">step</code> 引数と、負のインデックスはサポートされていません。例えば、次のように記述できます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Replacing a name with a substring of itself.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer <span class=\"o\">=</span> Writers<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Priyansh&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer<span class=\"o\">.</span>name <span class=\"o\">=</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)[</span><span class=\"mi\">1</span><span class=\"p\">:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer<span class=\"o\">.</span>refresh_from_db<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>writer<span class=\"o\">.</span>name\n<span class=\"go\">&#39;riya&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"avoiding-race-conditions-using-f\">\n<span id=\"id2\"></span><h4><code class=\"docutils literal notranslate\">F()</code> を使った競合状態の回避<a class=\"heading-anchor\" href=\"#avoiding-race-conditions-using-f\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code> のもう一つの便利な利点は、Pythonではなくデータベースがフィールドの値を更新することで <em>競合状態</em> を避けることができるということです。</p>\n<p>2つのPythonスレッドが上記の最初の例のコードを実行した場合、1つのスレッドはもう1つのスレッドがデータベースから値を取得した後にフィールドの値を取得、インクリメント、保存する可能性があります。2番目のスレッドが保存する値は元の値に基づいています。</p>\n<p>データベースがフィールドの更新を担当する場合、処理はより堅牢になります。 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> や <code class=\"docutils literal notranslate\">update()</code> が実行されたときに、インスタンスが取得されたときの値ではなく、データベースのフィールドの値だけに基づいてフィールドが更新されます。</p>\n</section>\n<section id=\"f-assignments-persist-after-model-save\">\n<h4><code class=\"docutils literal notranslate\">F()</code> への代入は <code class=\"docutils literal notranslate\">Model.save()</code> の後にも残ります<a class=\"heading-anchor\" href=\"#f-assignments-persist-after-model-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>モデルフィールドに割り当てられた <code class=\"docutils literal notranslate\">F()</code> オブジェクトはモデルインスタンスを保存した後も保持され、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">save()</code></a> のたびに適用されます。例えば：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>reporter <span class=\"o\">=</span> Reporters<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Tintin&quot;</span><span class=\"p\">)</span>\nreporter<span class=\"o\">.</span>stories_filed <span class=\"o\">=</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;stories_filed&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\nreporter<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\nreporter<span class=\"o\">.</span>name <span class=\"o\">=</span> <span class=\"s2\">&quot;Tintin Jr.&quot;</span>\nreporter<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>この場合、 <code class=\"docutils literal notranslate\">stories_filed</code> は2回更新されます。初期値が <code class=\"docutils literal notranslate\">1</code> であれば、最終的な値は <code class=\"docutils literal notranslate\">3</code> になります。このような永続化は、例えば <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model.refresh_from_db\" title=\"django.db.models.Model.refresh_from_db\"><code class=\"xref py py-meth docutils literal notranslate\">refresh_from_db()</code></a> を使ってモデルオブジェクトを保存した後にリロードすることで回避できます。</p>\n</section>\n<section id=\"using-f-in-filters\">\n<h4>フィルタで <code class=\"docutils literal notranslate\">F()</code> を使う<a class=\"heading-anchor\" href=\"#using-f-in-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code> は <code class=\"docutils literal notranslate\">QuerySet</code> フィルタでも非常に有用で、Python の値ではなく、フィールドの値に基づいてオブジェクトをフィルタリングできます。</p>\n<p>これは <a class=\"reference internal\" href=\"/ja/5.2/topics/db/queries/#using-f-expressions-in-filters\"><span class=\"std std-ref\">クエリで F() 式を使う</span></a> で説明されています。</p>\n</section>\n<section id=\"using-f-with-annotations\">\n<span id=\"id3\"></span><h4><code class=\"docutils literal notranslate\">F()</code> をアノテーションと一緒に使う<a class=\"heading-anchor\" href=\"#using-f-with-annotations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code> を使うと、算術演算で異なるフィールドを組み合わせてモデルに動的なフィールドを作成できます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>company <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>chairs_needed<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">)</span> <span class=\"o\">-</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;num_chairs&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>組み合わせるフィールドの型が異なる場合、どのようなフィールドが返されるかを Django に伝える必要があります。ほとんどの式は <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> をサポートしていますが、 <code class=\"docutils literal notranslate\">F()</code> はサポートしていないので、 <a class=\"reference internal\" href=\"#django.db.models.ExpressionWrapper\" title=\"django.db.models.ExpressionWrapper\"><code class=\"xref py py-class docutils literal notranslate\">ExpressionWrapper</code></a> で式をラップする必要があります：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> DateTimeField<span class=\"p\">,</span> ExpressionWrapper<span class=\"p\">,</span> F\n\nTicket<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n    expires<span class=\"o\">=</span>ExpressionWrapper<span class=\"p\">(</span>\n        F<span class=\"p\">(</span><span class=\"s2\">&quot;active_at&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;duration&quot;</span><span class=\"p\">),</span> output_field<span class=\"o\">=</span>DateTimeField<span class=\"p\">()</span>\n    <span class=\"p\">)</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">ForeignKey</code> のようなリレーション先フィールドを参照する場合、 <code class=\"docutils literal notranslate\">F()</code> はモデルインスタンスではなく主キーの値を返します：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>car <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>built_by<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;manufacturer&quot;</span><span class=\"p\">))[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>car<span class=\"o\">.</span>manufacturer\n<span class=\"go\">&lt;Manufacturer: Toyota&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>car<span class=\"o\">.</span>built_by\n<span class=\"go\">3</span>\n</code></pre></div>\n</section>\n<section id=\"using-f-to-sort-null-values\">\n<span id=\"id4\"></span><h4>NULL 値のソートに <code class=\"docutils literal notranslate\">F()</code> を使う<a class=\"heading-anchor\" href=\"#using-f-to-sort-null-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">F()</code> と <a class=\"reference internal\" href=\"#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">Expression.asc()</code></a> または <a class=\"reference internal\" href=\"#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\">desc()</code></a> のキーワード引数 <code class=\"docutils literal notranslate\">nulls_first</code> または <code class=\"docutils literal notranslate\">nulls_last</code> を使用して、フィールドの null 値のソートの順序を制御します。デフォルトでは、ソートの順序はデータベースに依存します。</p>\n<p>例えば、まだコンタクトしていない企業 (<code class=\"docutils literal notranslate\">last_contacted</code> がNULL) をコンタクトした企業の後に並べるには次のようにします：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n\nCompany<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;last_contacted&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">(</span>nulls_last<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"using-f-with-logical-operations\">\n<h4>論理演算で <code class=\"docutils literal notranslate\">F()</code> を使う<a class=\"heading-anchor\" href=\"#using-f-with-logical-operations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">BooleanField</code> を出力する <code class=\"docutils literal notranslate\">F()</code> 式は反転演算子 <code class=\"docutils literal notranslate\">~F()</code> で論理的に否定することができます。たとえば企業の is_active ステータスを反転する場合、以下のようにします：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n\nCompany<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>is_active<span class=\"o\">=~</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;is_active&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"func-expressions\">\n<span id=\"id5\"></span><h3><code class=\"docutils literal notranslate\">Func()</code> 式<a class=\"heading-anchor\" href=\"#func-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">Func()</code> 式は <code class=\"docutils literal notranslate\">COALESCE</code> や <code class=\"docutils literal notranslate\">LOWER</code> のようなデータベース関数や、 <code class=\"docutils literal notranslate\">SUM</code> のような集計を含むすべての式の基本型です。これらは直接使用できます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Func\n\nqueryset<span class=\"o\">.</span>annotate<span class=\"p\">(</span>field_lower<span class=\"o\">=</span>Func<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;field&quot;</span><span class=\"p\">),</span> function<span class=\"o\">=</span><span class=\"s2\">&quot;LOWER&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>または、データベース関数のライブラリを構築するためにも使用できます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Lower</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;LOWER&quot;</span>\n\n\nqueryset<span class=\"o\">.</span>annotate<span class=\"p\">(</span>field_lower<span class=\"o\">=</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;field&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>しかし、どちらの場合も、モデルが追加の属性 <code class=\"docutils literal notranslate\">field_lower</code> でアノテーションされたクエリセットを生成します。この属性は、大まかには次のSQLから生成されます：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span>\n    <span class=\"p\">...</span>\n    <span class=\"k\">LOWER</span><span class=\"p\">(</span><span class=\"ss\">&quot;db_table&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;field&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"ss\">&quot;field_lower&quot;</span>\n</code></pre></div>\n<p>組み込みのデータベース関数の一覧は <a class=\"reference internal\" href=\"/ja/5.2/ref/models/database-functions/\"><span class=\"doc\">データベース関数</span></a> を参照してください。</p>\n<p><code class=\"docutils literal notranslate\">Func</code> のAPI は以下の通りです：</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Func</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>expressions</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Func\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.function\">\n<span class=\"sig-name descname\">function</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.function\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>生成する関数を指定するクラス属性です。具体的には、 <code class=\"docutils literal notranslate\">function</code> が <a class=\"reference internal\" href=\"#django.db.models.Func.template\" title=\"django.db.models.Func.template\"><code class=\"xref py py-attr docutils literal notranslate\">template</code></a> 内の <code class=\"docutils literal notranslate\">function</code> プレースホルダとして補間されます。デフォルトは <code class=\"docutils literal notranslate\">None</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.template\">\n<span class=\"sig-name descname\">template</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この関数に対して生成される SQL を記述する、フォーマット文字列としてのクラス属性です。デフォルトは <code class=\"docutils literal notranslate\">'%(function)s(%(expressions)s)'</code> です。</p>\n<p><code class=\"docutils literal notranslate\">strftime('%W','date')</code> のようなSQLを作成していて、クエリでリテラル文字 <code class=\"docutils literal notranslate\">%</code> が必要な場合は、<code class=\"docutils literal notranslate\">template</code> 属性では <code class=\"docutils literal notranslate\">%%%%</code> と4倍にしてください。文字列は <code class=\"docutils literal notranslate\">as_sql()</code> でのテンプレート補間と、データベースカーソルでのクエリパラメータによるSQL補間の2回補間されるからです。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.arg_joiner\">\n<span class=\"sig-name descname\">arg_joiner</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.arg_joiner\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>クラス属性は <code class=\"docutils literal notranslate\">expressions</code> のリストを結合するために使用される文字を表します。デフォルトは <code class=\"docutils literal notranslate\">', '</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.arity\">\n<span class=\"sig-name descname\">arity</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.arity\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>関数が受け付ける引数の数を表すクラス属性です。この属性が設定されていて、関数が異なる数の式で呼び出された場合、 <code class=\"docutils literal notranslate\">TypeError</code> が発生します。デフォルトは <code class=\"docutils literal notranslate\">None</code> です。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Func.as_sql\">\n<span class=\"sig-name descname\">as_sql</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">compiler</em>, <em class=\"sig-param\">connection</em>, <em class=\"sig-param\">function<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">template<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">arg_joiner<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra_context</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Func.as_sql\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>データベース関数の SQL フラグメントを生成します。タプル <code class=\"docutils literal notranslate\">(sql, params)</code> を返します。<code class=\"docutils literal notranslate\">sql</code> は SQL 文字列で、<code class=\"docutils literal notranslate\">params</code> はクエリパラメータのリストまたはタプルです。</p>\n<p><code class=\"docutils literal notranslate\">as_vendor()</code> メソッドは、<code class=\"docutils literal notranslate\">function</code>, <code class=\"docutils literal notranslate\">template</code>, <code class=\"docutils literal notranslate\">arg_joiner</code> およびその他の <code class=\"docutils literal notranslate\">**extra_context</code> パラメータを使用して、必要に応じてSQLをカスタマイズするべきです。例えば：</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">django/db/models/functions.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"k\">class</span> <span class=\"nc\">ConcatPair</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;CONCAT&quot;</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">as_mysql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> <span class=\"o\">**</span>extra_context<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>as_sql<span class=\"p\">(</span>\n            compiler<span class=\"p\">,</span>\n            connection<span class=\"p\">,</span>\n            function<span class=\"o\">=</span><span class=\"s2\">&quot;CONCAT_WS&quot;</span><span class=\"p\">,</span>\n            template<span class=\"o\">=</span><span class=\"s2\">&quot;</span><span class=\"si\">%(function)s</span><span class=\"s2\">(&#39;&#39;, </span><span class=\"si\">%(expressions)s</span><span class=\"s2\">)&quot;</span><span class=\"p\">,</span>\n            <span class=\"o\">**</span>extra_context\n        <span class=\"p\">)</span>\n</code></pre></figure>\n<p>SQL インジェクションの脆弱性を回避するために、<code class=\"docutils literal notranslate\">extra_context</code> は <a class=\"reference internal\" href=\"#avoiding-sql-injection-in-query-expressions\"><span class=\"std std-ref\">信頼できないユーザー入力を含んではいけません</span></a> 。これらの値はデータベースドライバによってエスケープされるクエリパラメータとして渡されるのではなく、SQL文字列に補間されるからです。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>引数 <code class=\"docutils literal notranslate\">*expressions</code> は関数が適用される位置引数としての式のリストです。式は文字列に変換され、 <code class=\"docutils literal notranslate\">arg_joiner</code> で連結された後、 <code class=\"docutils literal notranslate\">expressions</code> プレースホルダとして <code class=\"docutils literal notranslate\">template</code> に挿入されます。</p>\n<p>位置引数には式か Python の値を指定できます。文字列はカラム参照とみなされ、 <code class=\"docutils literal notranslate\">F()</code> 式でラップされ、その他の値は <code class=\"docutils literal notranslate\">Value()</code> 式でラップされます。</p>\n<p><code class=\"docutils literal notranslate\">*extra</code> kwargs は <code class=\"docutils literal notranslate\">template</code> 属性に補間できる <code class=\"docutils literal notranslate\">key=value</code> のペアです。SQL インジェクションの脆弱性を回避するために、<code class=\"docutils literal notranslate\">*extra</code> は <a class=\"reference internal\" href=\"#avoiding-sql-injection-in-query-expressions\"><span class=\"std std-ref\">信頼できないユーザー入力を含んではいけません</span></a> 。これらの値はデータベースドライバによってエスケープされるクエリパラメータとして渡されるのではなく、SQL文字列に補間されるからです。</p>\n<p><code class=\"docutils literal notranslate\">function</code>, <code class=\"docutils literal notranslate\">template</code>, および <code class=\"docutils literal notranslate\">arg_joiner</code> キーワードは、同じ名前の属性を置き換えるために使用でき、独自のクラスを定義する必要はありません。<a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> は、期待される戻り値の型を定義するために使用できます。</p>\n</section>\n<section id=\"aggregate-expressions\">\n<h3><code class=\"docutils literal notranslate\">Aggregate()</code> 式<a class=\"heading-anchor\" href=\"#aggregate-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>集計式 (aggregate expression) は <a class=\"reference internal\" href=\"#func-expressions\"><span class=\"std std-ref\">Func() 式</span></a> の特殊なケースで、 <code class=\"docutils literal notranslate\">GROUP BY</code> 句が必要であることをクエリに通知します。 <code class=\"docutils literal notranslate\">Sum()</code> や <code class=\"docutils literal notranslate\">Count()</code> などの <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">集計関数</span></a> はすべて <code class=\"docutils literal notranslate\">Aggregate()</code> を継承しています。</p>\n<p><code class=\"docutils literal notranslate\">Aggregate</code> は式であり、ラップ式でもあるので、複雑な計算を表現できます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Count\n\nCompany<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n    managers_required<span class=\"o\">=</span><span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;num_employees&quot;</span><span class=\"p\">)</span> <span class=\"o\">/</span> <span class=\"mi\">4</span><span class=\"p\">)</span> <span class=\"o\">+</span> Count<span class=\"p\">(</span><span class=\"s2\">&quot;num_managers&quot;</span><span class=\"p\">)</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Aggregate</code> の API は以下の通りです：</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Aggregate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>expressions</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">distinct<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">filter<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">default<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.template\">\n<span class=\"sig-name descname\">template</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この aggregate 用に生成される SQL を記述する、フォーマット文字列としてのクラス属性です。デフォルトは <code class=\"docutils literal notranslate\">'%(function)s(%(distinct)s%(expressions)s)'</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.function\">\n<span class=\"sig-name descname\">function</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.function\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>生成される集計関数を記述するクラス属性です。具体的には、 <code class=\"docutils literal notranslate\">function</code> が <a class=\"reference internal\" href=\"#django.db.models.Aggregate.template\" title=\"django.db.models.Aggregate.template\"><code class=\"xref py py-attr docutils literal notranslate\">template</code></a> 内の <code class=\"docutils literal notranslate\">function</code> プレースホルダとして補間されます。デフォルトは <code class=\"docutils literal notranslate\">None</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.window_compatible\">\n<span class=\"sig-name descname\">window_compatible</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.window_compatible\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ほとんどの集計関数は <a class=\"reference internal\" href=\"#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a> のソース式として使用できるので、デフォルトは <code class=\"docutils literal notranslate\">True</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.allow_distinct\">\n<span class=\"sig-name descname\">allow_distinct</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.allow_distinct\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この集計関数が <code class=\"docutils literal notranslate\">distinct</code> キーワード引数を渡すことができるかどうかを決定するクラス属性。 <code class=\"docutils literal notranslate\">False</code> (デフォルト) に設定されている場合、 <code class=\"docutils literal notranslate\">distinct=True</code> が渡されると <code class=\"docutils literal notranslate\">TypeError</code> が発生します。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Aggregate.empty_result_set_value\">\n<span class=\"sig-name descname\">empty_result_set_value</span><a class=\"heading-anchor\" href=\"#django.db.models.Aggregate.empty_result_set_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ほとんどの集計関数は、空の結果セットに適用すると <code class=\"docutils literal notranslate\">NULL</code> となるため、デフォルトは <code class=\"docutils literal notranslate\">None</code> です。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>位置引数 <code class=\"docutils literal notranslate\">expressions</code> には、式、モデルフィールドのトランスフォーム、またはモデルフィールドの名前を指定できます。これらは文字列に変換され、 <code class=\"docutils literal notranslate\">template</code> 内の <code class=\"docutils literal notranslate\">expressions</code> プレースホルダとして使用されます。</p>\n<p>引数 <code class=\"docutils literal notranslate\">distinct</code> は、集計関数を <code class=\"docutils literal notranslate\">式</code> (または複数の <code class=\"docutils literal notranslate\">式</code> の場合は値の集合) ごとに呼び出すかどうかを決定します。この引数は <a class=\"reference internal\" href=\"#django.db.models.Aggregate.allow_distinct\" title=\"django.db.models.Aggregate.allow_distinct\"><code class=\"xref py py-attr docutils literal notranslate\">allow_distinct</code></a> が <code class=\"docutils literal notranslate\">True</code> に設定されている集計でのみサポートされます。</p>\n<p>引数 <code class=\"docutils literal notranslate\">filter</code> は <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q オブジェクト</code></a> を取り、集計する行をフィルタリングします。使用例については <a class=\"reference internal\" href=\"/ja/5.2/ref/models/conditional-expressions/#conditional-aggregation\"><span class=\"std std-ref\">条件付きの集計</span></a> と <a class=\"reference internal\" href=\"/ja/5.2/topics/db/aggregation/#filtering-on-annotations\"><span class=\"std std-ref\">アノテーションのフィルタリング</span></a> を参照してください。</p>\n<p>引数 <code class=\"docutils literal notranslate\">default</code> は <a class=\"reference internal\" href=\"/ja/5.2/ref/models/database-functions/#django.db.models.functions.Coalesce\" title=\"django.db.models.functions.Coalesce\"><code class=\"xref py py-class docutils literal notranslate\">Coalesce</code></a> に集計句と一緒に渡される値を取ります。これは、クエリセット(またはグループ化)にエントリがない場合に <code class=\"docutils literal notranslate\">None</code> 以外の値を返すように指定するのに便利です。</p>\n<p>この <code class=\"docutils literal notranslate\">**extra</code> キーワード引数は <code class=\"docutils literal notranslate\">template</code> 属性に補間できる <code class=\"docutils literal notranslate\">key=value</code> のペアです。</p>\n</section>\n<section id=\"creating-your-own-aggregate-functions\">\n<h3>独自の集計関数 (Aggregate Function) を作る<a class=\"heading-anchor\" href=\"#creating-your-own-aggregate-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>独自の集計関数を作成することもできます。最低限 <code class=\"docutils literal notranslate\">function</code> を定義する必要がありますが、生成される SQL を完全にカスタマイズすることもできます。以下に簡単な例を示します：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Aggregate\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Sum</span><span class=\"p\">(</span>Aggregate<span class=\"p\">):</span>\n    <span class=\"c1\"># Supports SUM(ALL field).</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;SUM&quot;</span>\n    template <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(function)s</span><span class=\"s2\">(</span><span class=\"si\">%(all_values)s%(expressions)s</span><span class=\"s2\">)&quot;</span>\n    allow_distinct <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    arity <span class=\"o\">=</span> <span class=\"mi\">1</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expression<span class=\"p\">,</span> all_values<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"o\">**</span>extra<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>expression<span class=\"p\">,</span> all_values<span class=\"o\">=</span><span class=\"s2\">&quot;ALL &quot;</span> <span class=\"k\">if</span> all_values <span class=\"k\">else</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> <span class=\"o\">**</span>extra<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"value-expressions\">\n<h3><code class=\"docutils literal notranslate\">Value()</code> 式<a class=\"heading-anchor\" href=\"#value-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Value\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Value</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">Value()</code> オブジェクトは式の最小の構成要素、つまり単純な値を表します。式の中で整数、真偽値、文字列の値を表す必要がある場合、その値を <code class=\"docutils literal notranslate\">Value()</code> で囲みます。</p>\n<p><code class=\"docutils literal notranslate\">Value()</code> を直接使用することはほとんどありません。 <code class=\"docutils literal notranslate\">F('field') + 1</code> という式を書くと、Djangoは暗黙のうちに <code class=\"docutils literal notranslate\">1</code> を <code class=\"docutils literal notranslate\">Value()</code> でラップし、単純な値をより複雑な式で使用できるようにします。式に文字列を渡したいときは <code class=\"docutils literal notranslate\">Value()</code> を使用する必要があります。ほとんどの式では、文字列引数をフィールド名として解釈します。例えば <code class=\"docutils literal notranslate\">Lower('name')</code> のように。</p>\n<p>引数 <code class=\"docutils literal notranslate\">value</code> には、 <code class=\"docutils literal notranslate\">1</code>, <code class=\"docutils literal notranslate\">True</code>, <code class=\"docutils literal notranslate\">None</code> など、式に含める値を記述します。Django はこれらの Python の値を対応するデータベース型に変換する方法を知っています。</p>\n<p><a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> が指定されていない場合、多くの一般的な型では <code class=\"docutils literal notranslate\">value</code> の型から推測されます。例えば、 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.datetime</code></a> のインスタンスを <code class=\"docutils literal notranslate\">value</code> として渡すと、 <code class=\"docutils literal notranslate\">output_field</code> のデフォルトは <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> です。</p>\n</section>\n<section id=\"expressionwrapper-expressions\">\n<h3><code class=\"docutils literal notranslate\">ExpressionWrapper()</code> 式<a class=\"heading-anchor\" href=\"#expressionwrapper-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.ExpressionWrapper\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ExpressionWrapper</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">output_field</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.ExpressionWrapper\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">ExpressionWrapper</code> は他の式を囲み、 <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> のような他の式では利用できないプロパティへのアクセスを提供します。 <code class=\"docutils literal notranslate\">ExpressionWrapper</code> は <a class=\"reference internal\" href=\"#using-f-with-annotations\"><span class=\"std std-ref\">F() をアノテーションと一緒に使う</span></a> で説明されているように、異なる型を持つ <code class=\"docutils literal notranslate\">F()</code> 式で算術演算を行う場合に必要です。</p>\n<aside class=\"admonition-database-casting-not-performed admonition\" role=\"note\">\n<p class=\"admonition-title\">Database casting not performed</p>\n<p><code class=\"docutils literal notranslate\">ExpressionWrapper</code> only sets the output field for the ORM and does not\nperform any database-level casting. To ensure a specific type is returned\nfrom the database, use <a class=\"reference internal\" href=\"/ja/5.2/ref/models/database-functions/#django.db.models.functions.Cast\" title=\"django.db.models.functions.Cast\"><code class=\"xref py py-class docutils literal notranslate\">Cast</code></a> instead.</p>\n</aside>\n</section>\n<section id=\"conditional-expressions\">\n<h3>条件式<a class=\"heading-anchor\" href=\"#conditional-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>条件式を用いると、<a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#if\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">if</code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#elif\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">elif</code></a> ... <a class=\"reference external\" href=\"https://docs.python.org/3/reference/compound_stmts.html#else\" title=\"(in Python v3.14)\"><code class=\"xref std std-keyword docutils literal notranslate\">else</code></a> ロジックをクエリーの中で使用できるようになります。Django はネイティブで SQL <code class=\"docutils literal notranslate\">CASE</code> 式をサポートしています。詳細については <a class=\"reference internal\" href=\"/ja/5.2/ref/models/conditional-expressions/\"><span class=\"doc\">条件式</span></a> を読んでください。</p>\n</section>\n<section id=\"subquery-expressions\">\n<h3><code class=\"docutils literal notranslate\">Subquery()</code> 式<a class=\"heading-anchor\" href=\"#subquery-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Subquery\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Subquery</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">queryset</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Subquery\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">Subquery</code> 式を使うと、 <code class=\"docutils literal notranslate\">QuerySet</code> に明示的にサブクエリを追加できます。</p>\n<p>たとえば、各投稿にその投稿の最新コメントの投稿者のメールアドレスをアノテーションとして付けることができます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> OuterRef<span class=\"p\">,</span> Subquery\n<span class=\"gp\">&gt;&gt;&gt; </span>newest <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>post<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-created_at&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>newest_commenter_email<span class=\"o\">=</span>Subquery<span class=\"p\">(</span>newest<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">1</span><span class=\"p\">]))</span>\n</code></pre></div>\n<p>PostgreSQLの場合、SQLは以下のようになります：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span>\n    <span class=\"k\">SELECT</span> U0<span class=\"p\">.</span><span class=\"ss\">&quot;email&quot;</span>\n    <span class=\"k\">FROM</span> <span class=\"ss\">&quot;comment&quot;</span> U0\n    <span class=\"k\">WHERE</span> U0<span class=\"p\">.</span><span class=\"ss\">&quot;post_id&quot;</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">ORDER</span> <span class=\"k\">BY</span> U0<span class=\"p\">.</span><span class=\"ss\">&quot;created_at&quot;</span> <span class=\"k\">DESC</span> <span class=\"k\">LIMIT</span> <span class=\"mi\">1</span>\n<span class=\"p\">)</span> <span class=\"k\">AS</span> <span class=\"ss\">&quot;newest_commenter_email&quot;</span> <span class=\"k\">FROM</span> <span class=\"ss\">&quot;post&quot;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>この節の例は、Django にサブクエリを強制する方法を示すものです。場合によっては、同じタスクをより明確に、あるいは効率的に実行する等価なクエリセットを書けるかもしれません。</p>\n</aside>\n<section id=\"referencing-columns-from-the-outer-queryset\">\n<h4>外側のクエリセットからカラムを参照する<a class=\"heading-anchor\" href=\"#referencing-columns-from-the-outer-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.OuterRef\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">OuterRef</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.OuterRef\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">OuterRef</code> は <code class=\"docutils literal notranslate\">Subquery</code> 内のクエリセットが外側のクエリまたはそのトランスフォームのフィールドから参照される必要がある場合に使用します。これは <a class=\"reference internal\" href=\"#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\">F</code></a> 式と同じように動作しますが、有効なフィールドを参照しているかどうかのチェックは外側のクエリセットが解決されるまで行われません。</p>\n<p><code class=\"docutils literal notranslate\">OuterRef</code> のインスタンスは、入れ子になった <code class=\"docutils literal notranslate\">Subquery</code> のインスタンスと一緒に使用できます。例えば、このクエリセットを正しく解決するには、 <code class=\"docutils literal notranslate\">Subquery</code> インスタンスの入れ子になったペア内にある必要があります：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>author<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)))</span>\n</code></pre></div>\n</section>\n<section id=\"limiting-a-subquery-to-a-single-column\">\n<h4>サブクエリを単一のカラムに絞る<a class=\"heading-anchor\" href=\"#limiting-a-subquery-to-a-single-column\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">Subquery</code> を <code class=\"docutils literal notranslate\">__in</code> ルックアップの対象として使う場合など、<code class=\"docutils literal notranslate\">Subquery</code> から単一のカラムを返さなければならないことがあります。たとえば、直近一日以内に公開された投稿のすべてのコメントを返す場合：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> timedelta\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>one_day_ago <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>posts <span class=\"o\">=</span> Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>published_at__gte<span class=\"o\">=</span>one_day_ago<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>post__in<span class=\"o\">=</span>Subquery<span class=\"p\">(</span>posts<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>この場合、サブクエリは <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">values()</code></a> を使って単一のカラム、つまり投稿の主キーだけを返さなければなりません。</p>\n</section>\n<section id=\"limiting-the-subquery-to-a-single-row\">\n<h4>サブクエリを1行に絞る<a class=\"heading-anchor\" href=\"#limiting-the-subquery-to-a-single-row\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>サブクエリが複数行を返すのを防ぐには、クエリセットのスライス (<code class=\"docutils literal notranslate\">[:1]</code>) を使用します：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>subquery <span class=\"o\">=</span> Subquery<span class=\"p\">(</span>newest<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;email&quot;</span><span class=\"p\">)[:</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>newest_commenter_email<span class=\"o\">=</span>subquery<span class=\"p\">)</span>\n</code></pre></div>\n<p>この場合、サブクエリは単一のカラムの単一の行、つまり最近作成されたコメントのメールアドレスだけを返す必要があります。</p>\n<p>（スライスの代わりに <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\">get()</code></a> を使うと、 <code class=\"docutils literal notranslate\">Subquery</code> 内でクエリセットが使われるまで <code class=\"docutils literal notranslate\">OuterRef</code> が解決できないため失敗します）</p>\n</section>\n<section id=\"exists-subqueries\">\n<h4><code class=\"docutils literal notranslate\">Exists()</code> サブクエリ<a class=\"heading-anchor\" href=\"#exists-subqueries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Exists\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Exists</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">queryset</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Exists\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\">Exists</code> は SQL の <code class=\"docutils literal notranslate\">EXISTS</code> ステートメントを使う <code class=\"docutils literal notranslate\">サブクエリ</code> のサブクラスです。多くの場合、最初にマッチする行が見つかった時点でデータベースがサブクエリの評価を停止できるので、サブクエリよりも性能が良くなります。</p>\n<p>たとえば、各投稿に直近1日以内のコメントがあるかどうかのアノテーションを付けることができます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Exists<span class=\"p\">,</span> OuterRef\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">datetime</span> <span class=\"kn\">import</span> timedelta\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>one_day_ago <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>recent_comments <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    post<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    created_at__gte<span class=\"o\">=</span>one_day_ago<span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>recent_comment<span class=\"o\">=</span>Exists<span class=\"p\">(</span>recent_comments<span class=\"p\">))</span>\n</code></pre></div>\n<p>PostgreSQLの場合、SQLは以下のようになります：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;published_at&quot;</span><span class=\"p\">,</span> <span class=\"k\">EXISTS</span><span class=\"p\">(</span>\n    <span class=\"k\">SELECT</span> <span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"ss\">&quot;a&quot;</span>\n    <span class=\"k\">FROM</span> <span class=\"ss\">&quot;comment&quot;</span> U0\n    <span class=\"k\">WHERE</span> <span class=\"p\">(</span>\n        U0<span class=\"p\">.</span><span class=\"ss\">&quot;created_at&quot;</span> <span class=\"o\">&gt;=</span> YYYY<span class=\"o\">-</span>MM<span class=\"o\">-</span>DD HH<span class=\"p\">:</span>MM<span class=\"p\">:</span>SS <span class=\"k\">AND</span>\n        U0<span class=\"p\">.</span><span class=\"ss\">&quot;post_id&quot;</span> <span class=\"o\">=</span> <span class=\"ss\">&quot;post&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;id&quot;</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">LIMIT</span> <span class=\"mi\">1</span>\n<span class=\"p\">)</span> <span class=\"k\">AS</span> <span class=\"ss\">&quot;recent_comment&quot;</span> <span class=\"k\">FROM</span> <span class=\"ss\">&quot;post&quot;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Exists</code> に単一のカラムの参照を強制する必要はありません。列は破棄され、真偽値の結果が返されるからです。同様に、ソートは SQL の <code class=\"docutils literal notranslate\">EXISTS</code> サブクエリ内では重要ではなく、パフォーマンスを低下させるだけなので、自動的に破棄されます。</p>\n<p><code class=\"docutils literal notranslate\">~Exists()</code> を使って <code class=\"docutils literal notranslate\">NOT EXISTS</code> をクエリできます。</p>\n</section>\n<section id=\"filtering-on-a-subquery-or-exists-expressions\">\n<h4><code class=\"docutils literal notranslate\">Subquery()</code> または <code class=\"docutils literal notranslate\">Exists()</code> 式におけるフィルタリング<a class=\"heading-anchor\" href=\"#filtering-on-a-subquery-or-exists-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>真偽値を返す <code class=\"docutils literal notranslate\">Subquery()</code> と <code class=\"docutils literal notranslate\">Exists()</code> は <a class=\"reference internal\" href=\"/ja/5.2/ref/models/conditional-expressions/#django.db.models.expressions.When\" title=\"django.db.models.expressions.When\"><code class=\"xref py py-class docutils literal notranslate\">When</code></a> 式で <code class=\"docutils literal notranslate\">condition</code> として使用したり、クエリセットに直接フィルタをかけたりすることができます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>recent_comments <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>  <span class=\"c1\"># From above</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>Exists<span class=\"p\">(</span>recent_comments<span class=\"p\">))</span>\n</code></pre></div>\n<p>これにより、サブクエリが <code class=\"docutils literal notranslate\">SELECT</code> カラムに追加されなくなり、パフォーマンスが向上する可能性があります。</p>\n</section>\n<section id=\"using-aggregates-within-a-subquery-expression\">\n<h4><code class=\"docutils literal notranslate\">Subquery</code> 式の中で集計 (aggregate) を使う<a class=\"heading-anchor\" href=\"#using-aggregates-within-a-subquery-expression\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>集計 (aggregate) は <code class=\"docutils literal notranslate\">Subquery</code> の中で使用できますが、サブクエリのグループ化を正しく行うためには <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">filter()</code></a>, <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">values()</code></a>, <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\">annotate()</code></a> の特定の組み合わせを必要とします。</p>\n<p>両方のモデルに <code class=\"docutils literal notranslate\">length</code> フィールドがあると仮定すると、投稿の長さがすべてのコメントの長さの合計よりも大きい投稿を見つけることができます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> OuterRef<span class=\"p\">,</span> Subquery<span class=\"p\">,</span> Sum\n<span class=\"gp\">&gt;&gt;&gt; </span>comments <span class=\"o\">=</span> Comment<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>post<span class=\"o\">=</span>OuterRef<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">()</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;post&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>total_comments <span class=\"o\">=</span> comments<span class=\"o\">.</span>annotate<span class=\"p\">(</span>total<span class=\"o\">=</span>Sum<span class=\"p\">(</span><span class=\"s2\">&quot;length&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;total&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>length__gt<span class=\"o\">=</span>Subquery<span class=\"p\">(</span>total_comments<span class=\"p\">))</span>\n</code></pre></div>\n<p>最初の <code class=\"docutils literal notranslate\">filter(...)</code> はサブクエリを関連するパラメータに制限します。 <code class=\"docutils literal notranslate\">order_by()</code> は <code class=\"docutils literal notranslate\">Comment</code> モデルのデフォルトの <a class=\"reference internal\" href=\"/ja/5.2/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ordering</code></a> (もしあれば) を削除します。 <code class=\"docutils literal notranslate\">value('post')</code> はコメントを <code class=\"docutils literal notranslate\">Post</code> で集計します。最後に、 <code class=\"docutils literal notranslate\">annotate(...)</code> が集計を行います。これらのクエリセットメソッドを適用する順番は重要です。この場合、サブクエリは1つのカラムに限定する必要があるため、 <code class=\"docutils literal notranslate\">values('total')</code> が必要となります。</p>\n<p>これは <code class=\"docutils literal notranslate\">Subquery</code> 内で集計を行う唯一の方法です。 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.aggregate\" title=\"django.db.models.query.QuerySet.aggregate\"><code class=\"xref py py-meth docutils literal notranslate\">aggregate()</code></a> を使用すると、クエリセットを評価しようとします（そして <code class=\"docutils literal notranslate\">OuterRef</code> がある場合、これを解決することはできません）。</p>\n</section>\n</section>\n<section id=\"raw-sql-expressions\">\n<h3>素の SQL 式<a class=\"heading-anchor\" href=\"#raw-sql-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.RawSQL\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RawSQL</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sql</em>, <em class=\"sig-param\">params</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.RawSQL\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>データベース式では複雑な <code class=\"docutils literal notranslate\">WHERE</code> 句を簡単に表現できないことがあります。このような場合は <code class=\"docutils literal notranslate\">RawSQL</code> 式を使用してください。たとえば：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.expressions</span> <span class=\"kn\">import</span> RawSQL\n<span class=\"gp\">&gt;&gt;&gt; </span>queryset<span class=\"o\">.</span>annotate<span class=\"p\">(</span>val<span class=\"o\">=</span>RawSQL<span class=\"p\">(</span><span class=\"s2\">&quot;select col from sometable where othercol = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span>param<span class=\"p\">,)))</span>\n</code></pre></div>\n<p>このような特別なルックアップは、（明示的にSQLコードを記述しているため）異なるデータベースエンジンに移植できない可能性があり、DRY原則に反するので、可能なら避けるべきです。</p>\n<p><code class=\"docutils literal notranslate\">RawSQL</code> 式は <code class=\"docutils literal notranslate\">__in</code> フィルタの対象としても使用できます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>queryset<span class=\"o\">.</span>filter<span class=\"p\">(</span>id__in<span class=\"o\">=</span>RawSQL<span class=\"p\">(</span><span class=\"s2\">&quot;select id from sometable where col = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span>param<span class=\"p\">,)))</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><a class=\"reference external\" href=\"https://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3\">SQLインジェクション攻撃</a> を防ぐために、 <code class=\"docutils literal notranslate\">params</code> を使って、ユーザが操作できるパラメータをエスケープする必要があります。 <code class=\"docutils literal notranslate\">params</code> は必須引数で、ユーザが入力したデータでSQLを補間しないことを強制するためのものです。</p>\n<p>また、SQL文字列のプレースホルダを引用符で囲んではいけません。 この例では <code class=\"docutils literal notranslate\">%s</code> を引用符で囲んでいるため、SQLインジェクションの脆弱性があります：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>RawSQL<span class=\"p\">(</span><span class=\"s2\">&quot;select col from sometable where othercol = &#39;</span><span class=\"si\">%s</span><span class=\"s2\">&#39;&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># unsafe!</span>\n</code></pre></div>\n<p>Django が <a class=\"reference internal\" href=\"/ja/5.2/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL インジェクションを防ぐ</span></a> 仕組みの説明があります。</p>\n</aside>\n</section>\n<section id=\"window-functions\">\n<h3>ウィンドウ関数<a class=\"heading-anchor\" href=\"#window-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ウィンドウ関数は、パーティション上で関数を適用する方法を提供します。通常の集計関数が group by で定義された各セットに対して最終結果を計算するのに対し、ウィンドウ関数は <a class=\"reference internal\" href=\"#window-frames\"><span class=\"std std-ref\">フレーム</span></a> とパーティション上で操作し、各行に対して結果を計算します。</p>\n<p>同じクエリ内で複数のウィンドウを指定することができ、Django ORM では <a class=\"reference internal\" href=\"/ja/5.2/topics/db/aggregation/\"><span class=\"doc\">QuerySet.annotate()</span></a> 呼び出しに複数の式を含めることで実現します。ORMは名前付きウィンドウを使用しませんが、代わりに選択されたカラムの一部となります。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.Window\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Window</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">partition_by<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">order_by<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">frame<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.Window\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.Window.template\">\n<span class=\"sig-name descname\">template</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.Window.template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>デフォルトは <code class=\"docutils literal notranslate\">%(expression)s OVER (%(window)s)</code> です。引数 <code class=\"docutils literal notranslate\">expression</code> だけを指定した場合、window 句は空白になります。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">Window</code> クラスは <code class=\"docutils literal notranslate\">OVER</code> 句のメインの式です。</p>\n<p>引数の <code class=\"docutils literal notranslate\">expression</code> は <a class=\"reference internal\" href=\"/ja/5.2/ref/models/database-functions/#window-functions\"><span class=\"std std-ref\">ウィンドウ関数</span></a>, <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#aggregation-functions\"><span class=\"std std-ref\">集計関数</span></a>, またはwindow句で互換性のある式です。</p>\n<p><code class=\"docutils literal notranslate\">partition_by</code> 引数には、行のパーティショニングを制御する式または一連の式 (カラム名は <code class=\"docutils literal notranslate\">F</code> オブジェクトで囲む必要があります) を指定します。パーティショニングは、結果セットを計算するために使用する行を絞り込みます。</p>\n<p><a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> は引数か式で指定します。</p>\n<p><code class=\"docutils literal notranslate\">order_by</code> 引数には <a class=\"reference internal\" href=\"#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">asc()</code></a> と <a class=\"reference internal\" href=\"#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\">desc()</code></a> を呼び出せる式、フィールド名の文字列 (オプションで降順を示す <code class=\"docutils literal notranslate\">&quot;-&quot;</code> をプレフィックスに付けられます)、または文字列や式のタプルやリストを渡すことができます。順序は式が適用される順番を制御します。例えば、パーティション内の行を合計した場合、最初の結果は最初の行の値になり、2番目は最初の行と2番目の行の合計になります。</p>\n<p>パラメータ <code class=\"docutils literal notranslate\">frame</code> は、計算に使用する他の行を指定します。詳細は <a class=\"reference internal\" href=\"#window-frames\"><span class=\"std std-ref\">フレーム</span></a> を参照してください。</p>\n<p>たとえば、各映画に同じスタジオによる同じジャンル・公開年の映画の平均レーティングでアノテーションを付ける場合：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        partition_by<span class=\"o\">=</span><span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        order_by<span class=\"o\">=</span><span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これにより、映画の評価が他の映画より高いか低いかをチェックできます。</p>\n<p>同じウィンドウ、つまり同じパーティションとフレームに複数の式を適用したい場合があります。例えば、同じクエリで3つのウィンドウ関数を使用することで、各映画のグループ（同じスタジオ、ジャンル、リリース年）のベストとワーストの評価も含めるように、前の例を修正できます。前の例のパーティションとソートは、繰り返しを減らすために辞書に抽出されます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> Max<span class=\"p\">,</span> Min<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>window <span class=\"o\">=</span> <span class=\"p\">{</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;partition_by&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;order_by&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"o\">**</span>window<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span>    best<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Max<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"o\">**</span>window<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span>    worst<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Min<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"o\">**</span>window<span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>ウィンドウ関数に対するフィルタリングは、ルックアップが分離型でない（コネクタとして <code class=\"docutils literal notranslate\">OR</code> や <code class=\"docutils literal notranslate\">XOR</code> を使用していない）限り、集計を実行するクエリセットに対してもサポートされます。</p>\n<p>たとえば、集計に依存し、ウィンドウ関数とフィールドに対して <code class=\"docutils literal notranslate\">OR</code> でフィルタされたクエリはサポートされていません。集計後に真偽値を返す関数を適用すると、通常はグループから除外されるはずの行が含まれる可能性があります：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>qs <span class=\"o\">=</span> Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    category_rank<span class=\"o\">=</span>Window<span class=\"p\">(</span>Rank<span class=\"p\">(),</span> partition_by<span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">,</span> order_by<span class=\"o\">=</span><span class=\"s2\">&quot;-rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    scenes_count<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;actors&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>Q<span class=\"p\">(</span>category_rank__lte<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>title__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Batman&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span>qs<span class=\"p\">)</span>\n<span class=\"go\">NotImplementedError: Heterogeneous disjunctive predicates against window functions</span>\n<span class=\"go\">are not implemented when performing conditional aggregation.</span>\n</code></pre></div>\n<p>Django に組み込みのデータベースバックエンドでは、MySQL、 PostgreSQL、 Oracle がウィンドウ表現をサポートしています。ウィンドウ表現機能のサポートはデータベースによって異なります。例えば、 <a class=\"reference internal\" href=\"#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">asc()</code></a> や <a class=\"reference internal\" href=\"#django.db.models.Expression.desc\" title=\"django.db.models.Expression.desc\"><code class=\"xref py py-meth docutils literal notranslate\">desc()</code></a> のオプションはサポートされていないかもしれません。必要に応じてデータベースのドキュメントを参照してください。</p>\n<section id=\"frames\">\n<span id=\"window-frames\"></span><h4>フレーム<a class=\"heading-anchor\" href=\"#frames\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>ウィンドウフレームでは、範囲ベースの行のシーケンスか、通常の行のシーケンスのいずれかを選択できます。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.ValueRange\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ValueRange</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">start<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">end<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">exclusion<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.ValueRange\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.ValueRange.frame_type\">\n<span class=\"sig-name descname\">frame_type</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.ValueRange.frame_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この属性は <code class=\"docutils literal notranslate\">'RANGE'</code> に設定されています。</p>\n</dd></dl>\n\n<p>PostgreSQLは <code class=\"docutils literal notranslate\">ValueRange</code> のサポートに制限があり、 <code class=\"docutils literal notranslate\">CURRENT ROW</code> や <code class=\"docutils literal notranslate\">UNBOUNDED FOLLOWING</code> のような標準的な開始点と終了点の使用しかサポートしていません。</p>\n<aside class=\"version-note version-changed\" data-version=\"5.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 5.1</p><p><code class=\"docutils literal notranslate\">exclusion</code> 引数が追加されました。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.RowRange\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RowRange</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">start<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">end<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">exclusion<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.RowRange\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.RowRange.frame_type\">\n<span class=\"sig-name descname\">frame_type</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.RowRange.frame_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この属性は <code class=\"docutils literal notranslate\">'ROWS'</code> に設定されています。</p>\n</dd></dl>\n\n<aside class=\"version-note version-changed\" data-version=\"5.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 5.1</p><p><code class=\"docutils literal notranslate\">exclusion</code> 引数が追加されました。</p>\n</aside>\n</dd></dl>\n\n<p>どちらのクラスもテンプレートとともにSQLを返します：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"o\">%</span><span class=\"p\">(</span>frame_type<span class=\"p\">)</span>s <span class=\"k\">BETWEEN</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">start</span><span class=\"p\">)</span>s <span class=\"k\">AND</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">end</span><span class=\"p\">)</span>s\n</code></pre></div>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">WindowFrameExclusion</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"5.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\">\n<span class=\"sig-name descname\">CURRENT_ROW</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.GROUP\">\n<span class=\"sig-name descname\">GROUP</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.GROUP\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.TIES\">\n<span class=\"sig-name descname\">TIES</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.TIES\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.expressions.WindowFrameExclusion.NO_OTHERS\">\n<span class=\"sig-name descname\">NO_OTHERS</span><a class=\"heading-anchor\" href=\"#django.db.models.expressions.WindowFrameExclusion.NO_OTHERS\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">exclusion</code> 引数は、サポートされているデータベースでウィンドウフレームから行（<a class=\"reference internal\" href=\"#django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\" title=\"django.db.models.expressions.WindowFrameExclusion.CURRENT_ROW\"><code class=\"xref py py-attr docutils literal notranslate\">CURRENT_ROW</code></a>）、グループ（<a class=\"reference internal\" href=\"#django.db.models.expressions.WindowFrameExclusion.GROUP\" title=\"django.db.models.expressions.WindowFrameExclusion.GROUP\"><code class=\"xref py py-attr docutils literal notranslate\">GROUP</code></a>）、および同点（<a class=\"reference internal\" href=\"#django.db.models.expressions.WindowFrameExclusion.TIES\" title=\"django.db.models.expressions.WindowFrameExclusion.TIES\"><code class=\"xref py py-attr docutils literal notranslate\">TIES</code></a>）を除外するために使用できます。</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"o\">%</span><span class=\"p\">(</span>frame_type<span class=\"p\">)</span>s <span class=\"k\">BETWEEN</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">start</span><span class=\"p\">)</span>s <span class=\"k\">AND</span> <span class=\"o\">%</span><span class=\"p\">(</span><span class=\"k\">end</span><span class=\"p\">)</span>s EXCLUDE <span class=\"o\">%</span><span class=\"p\">(</span>exclusion<span class=\"p\">)</span>s\n</code></pre></div>\n<p>フレームは、結果を計算するために使用される行を絞り込みます。ある開始点から指定された終了点までシフトします。フレームはパーティションの有無に関係なく使用できますが、決定論的な結果を得るためには、ウィンドウの順序を指定することを推奨します。フレームでは、フレーム内のピアは等価値を持つ行であり、ソート句がない場合はすべての行です。</p>\n<p>フレームのデフォルトの開始点は <code class=\"docutils literal notranslate\">UNBOUNDED PRECEDING</code> で、パーティションの最初の行になります。終了点は ORM が生成する SQL に常に明示的に含まれ、デフォルトでは <code class=\"docutils literal notranslate\">UNBOUNDED FOLLOWING</code> です。デフォルトのフレームは、パーティションからセットの最後の行までの全ての行を含みます。</p>\n<p><code class=\"docutils literal notranslate\">start</code> および <code class=\"docutils literal notranslate\">end</code> 引数に受け入れられる値は、<code class=\"docutils literal notranslate\">None</code>、整数、またはゼロです。<code class=\"docutils literal notranslate\">start</code> に負の整数を指定するとN行前 <code class=\"docutils literal notranslate\">N PRECEDING</code> となり、<code class=\"docutils literal notranslate\">None</code> は先頭行 <code class=\"docutils literal notranslate\">UNBOUNDED PRECEDING</code> となります。<code class=\"docutils literal notranslate\">ROWS</code> モードでは、<code class=\"docutils literal notranslate\">start</code> に正の整数を指定するとN行後 <code class=\"docutils literal notranslate\">N FOLLOWING</code> となります。<code class=\"docutils literal notranslate\">end</code> には正の整数も受け入れられ、これによりN行後 <code class=\"docutils literal notranslate\">N FOLLOWING</code> となります。<code class=\"docutils literal notranslate\">ROWS</code> モードでは、<code class=\"docutils literal notranslate\">end</code> に負の整数を指定するとN行前 <code class=\"docutils literal notranslate\">N PRECEDING</code> となります。<code class=\"docutils literal notranslate\">start</code> と <code class=\"docutils literal notranslate\">end</code> の両方でゼロを指定すると現在の行 <code class=\"docutils literal notranslate\">CURRENT ROW</code> が返されます。</p>\n<p><code class=\"docutils literal notranslate\">CURRENT ROW</code> が含むものには違いがあります。 <code class=\"docutils literal notranslate\">ROWS</code> モードで指定された場合、フレームは現在の行から開始または終了します。 <code class=\"docutils literal notranslate\">RANGE</code> モードで指定された場合、フレームはソートの順序に従って最初か最後のピアから開始または終了します。 したがって、 <code class=\"docutils literal notranslate\">RANGE CURRENT ROW</code> は、ソートで指定された同じ値を持つ行に対して式を評価します。テンプレートは <code class=\"docutils literal notranslate\">start</code> と <code class=\"docutils literal notranslate\">end</code> の両方を含むので、これは次のように表現できます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>ValueRange<span class=\"p\">(</span>start<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> end<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>映画の &quot;ピア&quot; が同じ年に同じジャンルで同じスタジオからリリースされた映画として記述されている場合、この <code class=\"docutils literal notranslate\">RowRange</code> の例では、映画の2つ前から2つ後のピアの平均評価で各映画にアノテーションを付けます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> RowRange<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        partition_by<span class=\"o\">=</span><span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        order_by<span class=\"o\">=</span><span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        frame<span class=\"o\">=</span>RowRange<span class=\"p\">(</span>start<span class=\"o\">=-</span><span class=\"mi\">2</span><span class=\"p\">,</span> end<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>データベースがサポートしていれば、パーティション内の式の値に基づいて開始点と終了点を指定することもできます。もし <code class=\"docutils literal notranslate\">Movie</code> モデルの <code class=\"docutils literal notranslate\">released</code> フィールドが各映画の公開月を保存している場合、この <code class=\"docutils literal notranslate\">ValueRange</code> の例では、各映画の12ヶ月前から12ヶ月後に公開された映画の同業者の平均レーティングでアノテーションを付けます：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> ValueRange<span class=\"p\">,</span> Window\n<span class=\"gp\">&gt;&gt;&gt; </span>Movie<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<span class=\"o\">=</span>Window<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        expression<span class=\"o\">=</span>Avg<span class=\"p\">(</span><span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        partition_by<span class=\"o\">=</span><span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;studio&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;genre&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        order_by<span class=\"o\">=</span><span class=\"s2\">&quot;released__year&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        frame<span class=\"o\">=</span>ValueRange<span class=\"p\">(</span>start<span class=\"o\">=-</span><span class=\"mi\">12</span><span class=\"p\">,</span> end<span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"5.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 5.1</p><p><code class=\"docutils literal notranslate\">RowRange</code> に対して、正の整数の <code class=\"docutils literal notranslate\">start</code> と負の整数の <code class=\"docutils literal notranslate\">end</code> のサポートが追加されました。</p>\n</aside>\n</section>\n</section>\n</section>\n<section id=\"technical-information\">\n<h2>技術的な情報<a class=\"heading-anchor\" href=\"#technical-information\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>以下に、ライブラリの作者に役立つ技術的な実装の詳細を示します。以下の技術的な API と例は、 Django が提供する組み込み機能を拡張する汎用的なクエリ式を作成するのに役立ちます。</p>\n<section id=\"expression-api\">\n<h3>式 (Expression) API<a class=\"heading-anchor\" href=\"#expression-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>クエリ式は <a class=\"reference internal\" href=\"/ja/5.2/ref/models/lookups/#query-expression\"><span class=\"std std-ref\">クエリ式 (expression) API</span></a> を実装していますが、以下のようなメソッドや属性も公開しています。すべてのクエリ式は <code class=\"docutils literal notranslate\">Expression()</code> または関連するサブクラスを継承しなければなりません。</p>\n<p>クエリ式が別の式をラップする場合、ラップされた式の適切なメソッドを呼び出す責任があります。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Expression</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.allowed_default\">\n<span class=\"sig-name descname\">allowed_default</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.allowed_default\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この式が <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.Field.db_default\" title=\"django.db.models.Field.db_default\"><code class=\"xref py py-attr docutils literal notranslate\">Field.db_default</code></a> で使えることを Django に伝えます。デフォルトは <code class=\"docutils literal notranslate\">False</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.constraint_validation_compatible\">\n<span class=\"sig-name descname\">constraint_validation_compatible</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.constraint_validation_compatible\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"5.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<p>この式が制約の検証中に使用できることを Django に教えます。<code class=\"docutils literal notranslate\">constraint_validation_compatible</code> が <code class=\"docutils literal notranslate\">False</code> に設定された式は、ソース式を1つだけ持つ必要があります。デフォルトでは <code class=\"docutils literal notranslate\">True</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.contains_aggregate\">\n<span class=\"sig-name descname\">contains_aggregate</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.contains_aggregate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Django に、この式が集計を含んでいて、クエリに <code class=\"docutils literal notranslate\">GROUP BY</code> 句を追加する必要があることを伝えます。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.contains_over_clause\">\n<span class=\"sig-name descname\">contains_over_clause</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.contains_over_clause\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この式が <a class=\"reference internal\" href=\"#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a> 式を含んでいることを Django に伝えます。これは例えば、データを変更するクエリでウィンドウ関数式を許可しないようにするのに使います。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.filterable\">\n<span class=\"sig-name descname\">filterable</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.filterable\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この式が <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.filter()</code></a> で参照できることを Django に伝えます。デフォルトは <code class=\"docutils literal notranslate\">True</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.window_compatible\">\n<span class=\"sig-name descname\">window_compatible</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.window_compatible\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この式を <a class=\"reference internal\" href=\"#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a> のソース式として使えるかどうかを Django に伝えます。デフォルトは <code class=\"docutils literal notranslate\">False</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.empty_result_set_value\">\n<span class=\"sig-name descname\">empty_result_set_value</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.empty_result_set_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Django に、式が空の結果セットに対して関数を適用する際にどの値を返すべきかを 指示します。デフォルトは <a class=\"reference external\" href=\"https://docs.python.org/3/library/constants.html#NotImplemented\" title=\"(in Python v3.14)\"><code class=\"xref py py-data docutils literal notranslate\">NotImplemented</code></a> で、式はデータベースで計算されます。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.set_returning\">\n<span class=\"sig-name descname\">set_returning</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.set_returning\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>この式が集合を返す関数を含むことを Django に知らせ、サブクエリの評価を強制します。これは例えば、アノテーションが自ら行を生成する場合に、一部の Postgres の集合を返す関数（例： <code class=\"docutils literal notranslate\">JSONB_PATH_QUERY</code> 、 <code class=\"docutils literal notranslate\">UNNEST</code> など）が最適化をスキップして正しく評価されるようにするために使用されます。デフォルトは <code class=\"docutils literal notranslate\">False</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.allows_composite_expressions\">\n<span class=\"sig-name descname\">allows_composite_expressions</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.allows_composite_expressions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"5.2\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>この式が複合式を許容することを Django に知らせます。例えば、 <a class=\"reference internal\" href=\"/ja/5.2/topics/composite-primary-key/#cpk-and-database-functions\"><span class=\"std std-ref\">複合主キー</span></a> をサポートするためなどに使用されます。デフォルトは <code class=\"docutils literal notranslate\">False</code> です。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.resolve_expression\">\n<span class=\"sig-name descname\">resolve_expression</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">query<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">allow_joins<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">reuse<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">summarize<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">for_save<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.resolve_expression\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>クエリに追加する前に、式の前処理や検証を行う機会を提供します。 <code class=\"docutils literal notranslate\">resolve_expression()</code> は、ネストした式に対しても必ず呼び出されなければなりません。 <code class=\"docutils literal notranslate\">self</code> の <code class=\"docutils literal notranslate\">copy()</code> は、必要な変換を行ったものを返すべきです。</p>\n<p><code class=\"docutils literal notranslate\">query</code> はバックエンドクエリの実装です。</p>\n<p><code class=\"docutils literal notranslate\">allow_joins</code> はクエリで結合を使用するかどうかを指定する真偽値です。</p>\n<p><code class=\"docutils literal notranslate\">reuse</code> は複数結合シナリオのための再利用可能な結合のセットです。</p>\n<p><code class=\"docutils literal notranslate\">summarize</code> は真偽値で、<code class=\"docutils literal notranslate\">True</code> の場合、計算中のクエリが終端の集計クエリであることを示します。</p>\n<p><code class=\"docutils literal notranslate\">for_save</code> は真偽値で、 <code class=\"docutils literal notranslate\">True</code> の場合、実行中のクエリが作成または更新を行うことを示します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.get_source_expressions\">\n<span class=\"sig-name descname\">get_source_expressions</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.get_source_expressions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>内部式の順序ありリストを返します。例えば：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Sum<span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>get_source_expressions<span class=\"p\">()</span>\n<span class=\"go\">[F(&#39;foo&#39;)]</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.set_source_expressions\">\n<span class=\"sig-name descname\">set_source_expressions</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expressions</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.set_source_expressions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>式のリストを受け取り、それを <code class=\"docutils literal notranslate\">get_source_expressions()</code> が返せるように格納します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.relabeled_clone\">\n<span class=\"sig-name descname\">relabeled_clone</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">change_map</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.relabeled_clone\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">self</code> のクローン（コピー）を返し、すべてのカラムエイリアスが再ラベル付けされます。カラムエイリアスは、サブクエリが作成される際に名前が変更されます。<code class=\"docutils literal notranslate\">relabeled_clone()</code> は、任意のネストされた式にも呼び出され、クローンに割り当てられるべきです。</p>\n<p><code class=\"docutils literal notranslate\">change_map</code> は古いエイリアスを新しいエイリアスにマッピングする辞書です。</p>\n<p>実装例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">relabeled_clone</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> change_map<span class=\"p\">):</span>\n    clone <span class=\"o\">=</span> copy<span class=\"o\">.</span>copy<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n    clone<span class=\"o\">.</span>expression <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>expression<span class=\"o\">.</span>relabeled_clone<span class=\"p\">(</span>change_map<span class=\"p\">)</span>\n    <span class=\"k\">return</span> clone\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.convert_value\">\n<span class=\"sig-name descname\">convert_value</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em>, <em class=\"sig-param\">expression</em>, <em class=\"sig-param\">connection</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.convert_value\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>式が <code class=\"docutils literal notranslate\">value</code> をより適切な型に強制するためのフック。</p>\n<p><code class=\"docutils literal notranslate\">expression</code> は <code class=\"docutils literal notranslate\">self</code> と同様です。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.get_group_by_cols\">\n<span class=\"sig-name descname\">get_group_by_cols</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.get_group_by_cols\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>この式によって参照されるカラムのリストを返す責任があります。<code class=\"docutils literal notranslate\">get_group_by_cols()</code> は、任意のネストされた式に対して呼び出されるべきです。特に、<code class=\"docutils literal notranslate\">F()</code> オブジェクトはカラムへの参照を保持しています。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.asc\">\n<span class=\"sig-name descname\">asc</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">nulls_first<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">nulls_last<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.asc\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>昇順でソートする準備が整った式を返します。</p>\n<p><code class=\"docutils literal notranslate\">nulls_first</code> と <code class=\"docutils literal notranslate\">nulls_last</code> は、null値がどのようにソートされるかを定義します。使用例については、<a class=\"reference internal\" href=\"#using-f-to-sort-null-values\"><span class=\"std std-ref\">NULL 値のソートに F() を使う</span></a> を参照してください。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.desc\">\n<span class=\"sig-name descname\">desc</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">nulls_first<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">nulls_last<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.desc\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>降順にソートする準備が整った式を返します。</p>\n<p><code class=\"docutils literal notranslate\">nulls_first</code> と <code class=\"docutils literal notranslate\">nulls_last</code> は、null値がどのようにソートされるかを定義します。使用例については、<a class=\"reference internal\" href=\"#using-f-to-sort-null-values\"><span class=\"std std-ref\">NULL 値のソートに F() を使う</span></a> を参照してください。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Expression.reverse_ordering\">\n<span class=\"sig-name descname\">reverse_ordering</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Expression.reverse_ordering\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">order_by</code> 呼び出しの順序を逆にするために必要な修正を加えた <code class=\"docutils literal notranslate\">self</code> を返します。例として、 <code class=\"docutils literal notranslate\">NULLS LAST</code> を実装した式は、その値を <code class=\"docutils literal notranslate\">NULLS FIRST</code> に変更します。この実装が必要なのは <code class=\"docutils literal notranslate\">OrderBy</code> のようなソート順を実装した式だけです。このメソッドは <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.reverse\" title=\"django.db.models.query.QuerySet.reverse\"><code class=\"xref py py-meth docutils literal notranslate\">reverse()</code></a> がクエリセットに対して呼び出されたときに呼び出されます。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"writing-your-own-query-expressions\">\n<h3>独自のクエリ式を書く<a class=\"heading-anchor\" href=\"#writing-your-own-query-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>他のクエリ式を使用したり、他のクエリ式と統合したりする独自のクエリ式クラスを書くことができます。組み込みの <a class=\"reference internal\" href=\"#func-expressions\"><span class=\"std std-ref\">Func() 式</span></a> を使用せずに <code class=\"docutils literal notranslate\">COALESCE</code> SQL関数の実装を書く例を見てみましょう。</p>\n<p>SQL 関数 <code class=\"docutils literal notranslate\">COALESCE</code> はカラムや値のリストを受け取るように定義されています。この関数は <code class=\"docutils literal notranslate\">NULL</code> でない最初のカラムまたは値を返します。</p>\n<p>まずはSQL生成に使用するテンプレートと、いくつかの属性を設定する <code class=\"docutils literal notranslate\">__init__()</code> メソッドを定義します：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Expression\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Coalesce</span><span class=\"p\">(</span>Expression<span class=\"p\">):</span>\n    template <span class=\"o\">=</span> <span class=\"s2\">&quot;COALESCE( </span><span class=\"si\">%(expressions)s</span><span class=\"s2\"> )&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expressions<span class=\"p\">,</span> output_field<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>output_field<span class=\"o\">=</span>output_field<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span>expressions<span class=\"p\">)</span> <span class=\"o\">&lt;</span> <span class=\"mi\">2</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;expressions must have at least 2 elements&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">for</span> expression <span class=\"ow\">in</span> expressions<span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span>expression<span class=\"p\">,</span> <span class=\"s2\">&quot;resolve_expression&quot;</span><span class=\"p\">):</span>\n                <span class=\"k\">raise</span> <span class=\"ne\">TypeError</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%r</span><span class=\"s2\"> is not an Expression&quot;</span> <span class=\"o\">%</span> expression<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>expressions <span class=\"o\">=</span> expressions\n</code></pre></div>\n<p>少なくとも 2 つのカラムまたは値を必要とし、式であることを確認するなど、パラメータの基本的な検証を行います。ここで <a class=\"reference internal\" href=\"#output-field\"><span class=\"std std-ref\">output_field</span></a> を要求しているのは、 Django が最終的な結果をどのようなモデルフィールドに代入すべきかを知るためです。</p>\n<p>前処理とバリデーションを実装します。この時点では独自のバリデーションを行っていないので、ネストした式に委譲します：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">resolve_expression</span><span class=\"p\">(</span>\n    <span class=\"bp\">self</span><span class=\"p\">,</span> query<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> allow_joins<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> reuse<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> summarize<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> for_save<span class=\"o\">=</span><span class=\"kc\">False</span>\n<span class=\"p\">):</span>\n    c <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>copy<span class=\"p\">()</span>\n    c<span class=\"o\">.</span>is_summary <span class=\"o\">=</span> summarize\n    <span class=\"k\">for</span> pos<span class=\"p\">,</span> expression <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>expressions<span class=\"p\">):</span>\n        c<span class=\"o\">.</span>expressions<span class=\"p\">[</span>pos<span class=\"p\">]</span> <span class=\"o\">=</span> expression<span class=\"o\">.</span>resolve_expression<span class=\"p\">(</span>\n            query<span class=\"p\">,</span> allow_joins<span class=\"p\">,</span> reuse<span class=\"p\">,</span> summarize<span class=\"p\">,</span> for_save\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> c\n</code></pre></div>\n<p>次に、SQLを生成するメソッドを書きます：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">as_sql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> template<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    sql_expressions<span class=\"p\">,</span> sql_params <span class=\"o\">=</span> <span class=\"p\">[],</span> <span class=\"p\">[]</span>\n    <span class=\"k\">for</span> expression <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>expressions<span class=\"p\">:</span>\n        sql<span class=\"p\">,</span> params <span class=\"o\">=</span> compiler<span class=\"o\">.</span>compile<span class=\"p\">(</span>expression<span class=\"p\">)</span>\n        sql_expressions<span class=\"o\">.</span>append<span class=\"p\">(</span>sql<span class=\"p\">)</span>\n        sql_params<span class=\"o\">.</span>extend<span class=\"p\">(</span>params<span class=\"p\">)</span>\n    template <span class=\"o\">=</span> template <span class=\"ow\">or</span> <span class=\"bp\">self</span><span class=\"o\">.</span>template\n    data <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;expressions&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>sql_expressions<span class=\"p\">)}</span>\n    <span class=\"k\">return</span> template <span class=\"o\">%</span> data<span class=\"p\">,</span> sql_params\n\n\n<span class=\"k\">def</span> <span class=\"nf\">as_oracle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Example of vendor specific handling (Oracle in this case).</span>\n<span class=\"sd\">    Let&#39;s make the function name lowercase.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>as_sql<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> template<span class=\"o\">=</span><span class=\"s2\">&quot;coalesce( </span><span class=\"si\">%(expressions)s</span><span class=\"s2\"> )&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">as_sql()</code> メソッドはカスタムキーワード引数をサポート可能で、これにより <code class=\"docutils literal notranslate\">as_vendorname()</code> メソッドがSQL文字列を生成するためのデータをオーバーライドできます。<code class=\"docutils literal notranslate\">as_vendorname()</code> メソッド内で <code class=\"docutils literal notranslate\">self</code> を変更するよりも、<code class=\"docutils literal notranslate\">as_sql()</code> キーワード引数を使用してカスタマイズする方が好ましいです。前者は異なるデータベースバックエンドで実行する際にエラーを引き起こす可能性があるためです。クラスがクラス属性に依存してデータを定義している場合は、<code class=\"docutils literal notranslate\">as_sql()</code> メソッドでオーバーライドを許可することを検討してください。</p>\n<p><code class=\"docutils literal notranslate\">compiler.compile()</code> メソッドを使って各 <code class=\"docutils literal notranslate\">expressions</code> のSQLを生成し、その結果をカンマで連結します。そして、テンプレートにデータを入力し、SQLとパラメータを返します。</p>\n<p>また、Oracle バックエンドに特化したカスタム実装も定義しました。Oracle バックエンドが使用されている場合は、 <code class=\"docutils literal notranslate\">as_sql()</code> の代わりに <code class=\"docutils literal notranslate\">as_oracle()</code> 関数が呼び出されます。</p>\n<p>最後に、クエリ式が他のクエリ式と協調できるようにするためのメソッドを実装します：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">get_source_expressions</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>expressions\n\n\n<span class=\"k\">def</span> <span class=\"nf\">set_source_expressions</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expressions<span class=\"p\">):</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span>expressions <span class=\"o\">=</span> expressions\n</code></pre></div>\n<p>どう動作するか見てみましょう：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F<span class=\"p\">,</span> Value<span class=\"p\">,</span> CharField\n<span class=\"gp\">&gt;&gt;&gt; </span>qs <span class=\"o\">=</span> Company<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    tagline<span class=\"o\">=</span>Coalesce<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"p\">[</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;motto&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;ticker_name&quot;</span><span class=\"p\">),</span> F<span class=\"p\">(</span><span class=\"s2\">&quot;description&quot;</span><span class=\"p\">),</span> Value<span class=\"p\">(</span><span class=\"s2\">&quot;No Tagline&quot;</span><span class=\"p\">)],</span>\n<span class=\"gp\">... </span>        output_field<span class=\"o\">=</span>CharField<span class=\"p\">(),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> c <span class=\"ow\">in</span> qs<span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>c<span class=\"o\">.</span>name<span class=\"p\">,</span> c<span class=\"o\">.</span>tagline<span class=\"p\">))</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">Google: Do No Evil</span>\n<span class=\"go\">Apple: AAPL</span>\n<span class=\"go\">Yahoo: Internet Company</span>\n<span class=\"go\">Django Software Foundation: No Tagline</span>\n</code></pre></div>\n<section id=\"avoiding-sql-injection\">\n<span id=\"avoiding-sql-injection-in-query-expressions\"></span><h4>SQL インジェクションを防ぐ<a class=\"heading-anchor\" href=\"#avoiding-sql-injection\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">Func</code> の <code class=\"docutils literal notranslate\">__init__()</code> (<code class=\"docutils literal notranslate\">**extra</code>) および <code class=\"docutils literal notranslate\">as_sql()</code> (<code class=\"docutils literal notranslate\">**extra_context</code>) のキーワード引数は、 (データベースドライバがエスケープするような) クエリパラメータとして渡されるのではなく、SQL 文字列に補間されるので、信頼できないユーザ入力を含んではいけません。</p>\n<p>例えば、<code class=\"docutils literal notranslate\">substring</code> がユーザーが入力したものである場合、この関数は SQL インジェクションに対して脆弱です：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Func\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Position</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;POSITION&quot;</span>\n    template <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%(function)s</span><span class=\"s2\">(&#39;</span><span class=\"si\">%(substring)s</span><span class=\"s2\">&#39; in </span><span class=\"si\">%(expressions)s</span><span class=\"s2\">)&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expression<span class=\"p\">,</span> substring<span class=\"p\">):</span>\n        <span class=\"c1\"># substring=substring is an SQL injection vulnerability!</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>expression<span class=\"p\">,</span> substring<span class=\"o\">=</span>substring<span class=\"p\">)</span>\n</code></pre></div>\n<p>この関数はパラメータなしで SQL 文字列を生成します。 <code class=\"docutils literal notranslate\">substring</code> はキーワード引数として <code class=\"docutils literal notranslate\">super().__init__()</code> に渡されるので、クエリがデータベースに送信される前に SQL 文字列に補間されます。</p>\n<p>以下が修正後の実装です：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Position</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;POSITION&quot;</span>\n    arg_joiner <span class=\"o\">=</span> <span class=\"s2\">&quot; IN &quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> expression<span class=\"p\">,</span> substring<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>substring<span class=\"p\">,</span> expression<span class=\"p\">)</span>\n</code></pre></div>\n<p>代わりに <code class=\"docutils literal notranslate\">substring</code> を位置引数として渡すと、データベースクエリのパラメータとして渡されます。</p>\n</section>\n</section>\n<section id=\"adding-support-in-third-party-database-backends\">\n<h3>サードパーティのデータベースバックエンドへのサポートを追加する<a class=\"heading-anchor\" href=\"#adding-support-in-third-party-database-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ある関数で異なる SQL 構文を使用するデータベースバックエンドを使用している場合は、 その関数のクラスに新しいメソッドを追加することで対応できます。</p>\n<p>例えば Microsoft SQL Server 用のバックエンドを書くとしましょう。このバックエンドでは <a class=\"reference internal\" href=\"/ja/5.2/ref/models/database-functions/#django.db.models.functions.Length\" title=\"django.db.models.functions.Length\"><code class=\"xref py py-class docutils literal notranslate\">Length</code></a> 関数に <code class=\"docutils literal notranslate\">LENGTH</code> の代わりに <code class=\"docutils literal notranslate\">LEN</code> という SQL を使用します。 <code class=\"docutils literal notranslate\">as_sqlserver()</code> という新しいメソッドを <code class=\"docutils literal notranslate\">Length</code> クラスに追加します：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Length\n\n\n<span class=\"k\">def</span> <span class=\"nf\">sqlserver_length</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>as_sql<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> function<span class=\"o\">=</span><span class=\"s2\">&quot;LEN&quot;</span><span class=\"p\">)</span>\n\n\nLength<span class=\"o\">.</span>as_sqlserver <span class=\"o\">=</span> sqlserver_length\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">as_sql()</code> の <code class=\"docutils literal notranslate\">template</code> パラメータを使って SQL をカスタマイズすることもできます。</p>\n<p><code class=\"docutils literal notranslate\">django.db.connection.vendor</code> がバックエンドに <code class=\"docutils literal notranslate\">sqlserver</code> を返すので、 <code class=\"docutils literal notranslate\">as_sqlserver()</code> を使用します。</p>\n<p>サードパーティのバックエンドは、バックエンドパッケージのトップレベルの <code class=\"docutils literal notranslate\">__init__.py</code> ファイル、またはトップレベルの <code class=\"docutils literal notranslate\">__init__.py</code> からインポートされたトップレベルの <code class=\"docutils literal notranslate\">expressions.py</code> ファイル (またはパッケージ) に関数を登録できます。</p>\n<p>使用しているバックエンドにパッチを当てたいユーザプロジェクトでは、このコードを <a class=\"reference internal\" href=\"/ja/5.2/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">AppConfig.ready()</code></a> メソッドに記述します。</p>\n</section>\n</section>","rootId":"query-expressions","toc":[{"title":"サポートされている算術演算","anchor":"supported-arithmetic","children":[]},{"title":"出力フィールド (output_field)","anchor":"output-field","children":[]},{"title":"例","anchor":"some-examples","children":[]},{"title":"組み込みのクエリ式","anchor":"built-in-expressions","children":[{"title":"F() 式","anchor":"f-expressions","children":[{"title":"F() 式のスライス","anchor":"slicing-f-expressions","children":[]},{"title":"F() を使った競合状態の回避","anchor":"avoiding-race-conditions-using-f","children":[]},{"title":"F() への代入は Model.save() の後にも残ります","anchor":"f-assignments-persist-after-model-save","children":[]},{"title":"フィルタで F() を使う","anchor":"using-f-in-filters","children":[]},{"title":"F() をアノテーションと一緒に使う","anchor":"using-f-with-annotations","children":[]},{"title":"NULL 値のソートに F() を使う","anchor":"using-f-to-sort-null-values","children":[]},{"title":"論理演算で F() を使う","anchor":"using-f-with-logical-operations","children":[]}]},{"title":"Func() 式","anchor":"func-expressions","children":[]},{"title":"Aggregate() 式","anchor":"aggregate-expressions","children":[]},{"title":"独自の集計関数 (Aggregate Function) を作る","anchor":"creating-your-own-aggregate-functions","children":[]},{"title":"Value() 式","anchor":"value-expressions","children":[]},{"title":"ExpressionWrapper() 式","anchor":"expressionwrapper-expressions","children":[]},{"title":"条件式","anchor":"conditional-expressions","children":[]},{"title":"Subquery() 式","anchor":"subquery-expressions","children":[{"title":"外側のクエリセットからカラムを参照する","anchor":"referencing-columns-from-the-outer-queryset","children":[]},{"title":"サブクエリを単一のカラムに絞る","anchor":"limiting-a-subquery-to-a-single-column","children":[]},{"title":"サブクエリを1行に絞る","anchor":"limiting-the-subquery-to-a-single-row","children":[]},{"title":"Exists() サブクエリ","anchor":"exists-subqueries","children":[]},{"title":"Subquery() または Exists() 式におけるフィルタリング","anchor":"filtering-on-a-subquery-or-exists-expressions","children":[]},{"title":"Subquery 式の中で集計 (aggregate) を使う","anchor":"using-aggregates-within-a-subquery-expression","children":[]}]},{"title":"素の SQL 式","anchor":"raw-sql-expressions","children":[]},{"title":"ウィンドウ関数","anchor":"window-functions","children":[{"title":"フレーム","anchor":"frames","children":[]}]}]},{"title":"技術的な情報","anchor":"technical-information","children":[{"title":"式 (Expression) API","anchor":"expression-api","children":[]},{"title":"独自のクエリ式を書く","anchor":"writing-your-own-query-expressions","children":[{"title":"SQL インジェクションを防ぐ","anchor":"avoiding-sql-injection","children":[]}]},{"title":"サードパーティのデータベースバックエンドへのサポートを追加する","anchor":"adding-support-in-third-party-database-backends","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API リファレンス","url":"/ja/5.2/ref/"},{"docname":"ref/models/index","title":"モデル","url":"/ja/5.2/ref/models/"}],"prev":{"docname":"ref/models/lookups","title":"ルックアップ API リファレンス","url":"/ja/5.2/ref/models/lookups/"},"next":{"docname":"ref/models/conditional-expressions","title":"条件式","url":"/ja/5.2/ref/models/conditional-expressions/"},"formats":{"html":"/ja/5.2/ref/models/expressions/","markdown":"/ja/5.2/ref/models/expressions.md","json":"/ja/5.2/ref/models/expressions.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/models/expressions.txt","official":"https://docs.djangoproject.com/ja/5.2/ref/models/expressions/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}