{"title":"QuerySet API 参考","version":"6.1","locale":"zh-hans","docname":"ref/models/querysets","url":"/zh-hans/6.1/ref/models/querysets/","canonical":"https://djangodocs.dev/zh-hans/6.1/ref/models/querysets/","summary":"该文档描述了 QuerySet API 的细节。它是建立在模型和数据库查询指南的材料基础上的，因此，在阅读这篇文档之前，你可能需要阅读和理解这些文档。","html":"<h1><code class=\"docutils literal notranslate\">QuerySet</code> API 参考<a class=\"heading-anchor\" href=\"#queryset-api-reference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>该文档描述了 <code class=\"docutils literal notranslate\">QuerySet</code> API 的细节。它是建立在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/\"><span class=\"doc\">模型</span></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/\"><span class=\"doc\">数据库查询</span></a> 指南的材料基础上的，因此，在阅读这篇文档之前，你可能需要阅读和理解这些文档。</p>\n<p>在整个参考资料中，我们将使用在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/\"><span class=\"doc\">数据库查询指南</span></a> 中提出的  <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#queryset-model-example\"><span class=\"std std-ref\">示例博客模型</span></a>。</p>\n<section id=\"when-querysets-are-evaluated\">\n<span id=\"id1\"></span><h2>什么时候 <code class=\"docutils literal notranslate\">QuerySet</code> 被执行<a class=\"heading-anchor\" href=\"#when-querysets-are-evaluated\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\">QuerySet</code> 本身可以被构造，过滤，切片，或者复制赋值等，是无需访问数据库的。只有在你需要从数据库取出数据或者，向数据库存入数据时才需要访问数据库。</p>\n<p>你可以用以下方式执行一个 <code class=\"docutils literal notranslate\">QuerySet</code>：</p>\n<ul>\n<li><p><strong>迭代。</strong> 一个 <code class=\"docutils literal notranslate\">QuerySet</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=\"k\">for</span> e <span class=\"ow\">in</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span>e<span class=\"o\">.</span>headline<span class=\"p\">)</span>\n</code></pre></div>\n<p>注意：如果你想做的只是确定至少一个结果是否存在，不要使用这个。使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\">exists()</code></a> 会更有效。</p>\n</li>\n<li><p><strong>异步迭代</strong>。可以使用 <code class=\"docutils literal notranslate\">async for</code> 来迭代一个 <code class=\"docutils literal notranslate\">QuerySet</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=\"k\">async</span> <span class=\"k\">for</span> e <span class=\"ow\">in</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">():</span>\n    results<span class=\"o\">.</span>append<span class=\"p\">(</span>e<span class=\"p\">)</span>\n</code></pre></div>\n<p>QuerySets 的同步和异步迭代器共享相同的底层缓存。</p>\n</li>\n<li><p><strong>切片。</strong> 正如在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#limiting-querysets\"><span class=\"std std-ref\">限制 QuerySet 条目数</span></a> 中所解释的那样，<code class=\"docutils literal notranslate\">QuerySet</code> 可以使用 Python 的数组切片语法进行切片。切片一个未执行的 <code class=\"docutils literal notranslate\">QuerySet</code> 通常会返回另一个未执行的 <code class=\"docutils literal notranslate\">QuerySet</code>，但如果使用切片语法的 <code class=\"docutils literal notranslate\">step</code> 参数，Django 会执行数据库查询，并返回一个列表。切片一个已经执行过的 <code class=\"docutils literal notranslate\">QuerySet</code> 也会返回一个列表。</p>\n<p>还要注意的是，即使对一个未执行的 <code class=\"docutils literal notranslate\">QuerySet</code> 进行切片，返回另一个未执行的 <code class=\"docutils literal notranslate\">QuerySet</code>，也不允许进一步修改它（例如，添加更多的过滤器，或修改排序），因为这不能很好地翻译成 SQL，也没有明确的含义。</p>\n</li>\n<li><p><strong>Pickle 序列化／缓存。</strong> 关于 <a class=\"reference internal\" href=\"#pickling-querysets\">pickling QuerySets</a> 时涉及的细节，请参见下一节。就本节而言，重要的是，结果是从数据库中读取的。</p></li>\n<li><p><strong>repr()。</strong> 当你调用 <code class=\"docutils literal notranslate\">repr()</code> 时，所在 <code class=\"docutils literal notranslate\">QuerySet</code> 会被执行。这是为了方便 Python 交互式解释器，所以当你交互式使用 API 时，可以立即看到你的结果。</p></li>\n<li><p><strong>len()。</strong> 当你调用 <code class=\"docutils literal notranslate\">len()</code> 时，会执行 <code class=\"docutils literal notranslate\">QuerySet</code>。正如你所期望的，这将返回结果列表的长度。</p>\n<p>注意：如果你只需要确定集合中的记录数（而不需要实际的对象），那么使用 SQL 的 <code class=\"docutils literal notranslate\">SELECT COUNT(*)</code> 在数据库层面上处理计数会更有效率。Django 提供了一个 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.count\" title=\"django.db.models.query.QuerySet.count\"><code class=\"xref py py-meth docutils literal notranslate\">count()</code></a> 方法正是为了这个原因。</p>\n</li>\n<li><p><strong>list()。</strong> 通过调用 <code class=\"docutils literal notranslate\">list()</code> 强制执行 <code class=\"docutils literal notranslate\">QuerySet</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>entry_list <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">())</span>\n</code></pre></div>\n</li>\n<li><p><strong>bool()。</strong> 在布尔语境中测试 <code class=\"docutils literal notranslate\">QuerySet</code>，如使用 <code class=\"docutils literal notranslate\">bool()</code>、<code class=\"docutils literal notranslate\">or</code>、<code class=\"docutils literal notranslate\">and</code> 或 <code class=\"docutils literal notranslate\">if</code> 语句，将导致查询被执行。如果至少有一个结果，则 <code class=\"docutils literal notranslate\">QuerySet</code> 为 <code class=\"docutils literal notranslate\">True</code>，否则为 <code class=\"docutils literal notranslate\">False</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=\"k\">if</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one Entry with the headline Test&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>注意：如果你只想确定至少一个结果是否存在（而不需要实际的对象），使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\">exists()</code></a> 更高效。</p>\n</li>\n</ul>\n<section id=\"pickling-querysets\">\n<span id=\"id2\"></span><h3>Pickle 序列化 <code class=\"docutils literal notranslate\">QuerySet</code><a class=\"heading-anchor\" href=\"#pickling-querysets\"><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/library/pickle.html#module-pickle\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">pickle</code></a> 序列化一个 <code class=\"docutils literal notranslate\">QuerySet</code>，这将迫使所有结果在 pickle 序列化之前加载到内存中。Pickle 序列化通常被用作缓存的前奏，当缓存的查询集被重新加载时，你希望结果已经存在并可以使用（从数据库读取可能需要一些时间，这就违背了缓存的目的）。这意味着，当你取消缓存一个 <code class=\"docutils literal notranslate\">QuerySet</code> 时，它包含的是它被缓存时的结果，而不是当前在数据库中的结果。</p>\n<p>如果你只想要将必要的信息存储为 pickle，在以后的时间从数据库中重新创建 <code class=\"docutils literal notranslate\">QuerySet</code>，可以 pickle <code class=\"docutils literal notranslate\">QuerySet</code> 的 <code class=\"docutils literal notranslate\">query</code> 属性。然后，可以使用类似以下的代码重新创建原始的 <code class=\"docutils literal notranslate\">QuerySet</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\">import</span> <span class=\"nn\">pickle</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>query <span class=\"o\">=</span> pickle<span class=\"o\">.</span>loads<span class=\"p\">(</span>s<span class=\"p\">)</span>  <span class=\"c1\"># Assuming &#39;s&#39; is the pickled string.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>qs <span class=\"o\">=</span> MyModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>qs<span class=\"o\">.</span>query <span class=\"o\">=</span> query  <span class=\"c1\"># Restore the original &#39;query&#39;.</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">query</code> 属性是一个不透明的对象。它代表了查询结构的内部结构，不是公共 API 的一部分。但是，如这里所述，可以安全地（并完全支持）pickle 序列化和反序列化该属性的内容。</p>\n<aside class=\"admonition-restrictions-on-queryset-values-list admonition\" role=\"note\">\n<p class=\"admonition-title\">对 <code class=\"docutils literal notranslate\">QuerySet.values_list()</code> 的限制</p>\n<p>如果使用 pickle 重新创建 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.values_list()</code></a>，它将被转换为 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.values()</code></a>：</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\">import</span> <span class=\"nn\">pickle</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>qs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>qs\n<span class=\"go\">&lt;QuerySet [(1, &#39;Beatles Blog&#39;)]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reloaded_qs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reloaded_qs<span class=\"o\">.</span>query <span class=\"o\">=</span> pickle<span class=\"o\">.</span>loads<span class=\"p\">(</span>pickle<span class=\"o\">.</span>dumps<span class=\"p\">(</span>qs<span class=\"o\">.</span>query<span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reloaded_qs\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;}]&gt;</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition-you-can-t-share-pickles-between-versions admonition\" role=\"note\">\n<p class=\"admonition-title\">你不能在不同版本之间共享 pickle</p>\n<p>Pickles of <code class=\"docutils literal notranslate\">QuerySet</code> objects are only valid for the version of Django\nthat was used to generate them. If you generate a pickle using Django\nversion N, there is no guarantee that pickle will be readable with\nDjango version N+1. Pickles should not be used as part of a long-term\narchival strategy.</p>\n<p>由于 pickle 兼容性错误可能很难诊断，比如静默损坏对象，所以当你试图在与序列化 pickle 时不同版本的 Django 中反序列化查询集时，会发出 <code class=\"docutils literal notranslate\">RuntimeWarning</code>。</p>\n</aside>\n</section>\n</section>\n<section id=\"queryset-api\">\n<span id=\"id3\"></span><h2><code class=\"docutils literal notranslate\">QuerySet</code> API<a class=\"heading-anchor\" href=\"#queryset-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>这里是 <code class=\"docutils literal notranslate\">QuerySet</code> 的正式声明：</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">QuerySet</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">query<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">hints<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>通常当你与 <code class=\"docutils literal notranslate\">QuerySet</code> 交互时，你会通过 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#chaining-filters\"><span class=\"std std-ref\">链式过滤器</span></a> 来使用它。为了实现这一目的，大多数 <code class=\"docutils literal notranslate\">QuerySet</code> 方法都会返回新的查询集。这些方法将在本节后面详细介绍。</p>\n<p><code class=\"docutils literal notranslate\">QuerySet</code> 类具有以下公共属性，可以用于自省：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.ordered\">\n<span class=\"sig-name descname\">ordered</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.ordered\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">True</code> if the <code class=\"docutils literal notranslate\">QuerySet</code> is ordered — i.e. has an\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> clause or a default ordering on the model.\n<code class=\"docutils literal notranslate\">False</code> otherwise.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.totally_ordered\">\n<span class=\"sig-name descname\">totally_ordered</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.totally_ordered\"><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=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>Returns <code class=\"docutils literal notranslate\">True</code> if the <code class=\"docutils literal notranslate\">QuerySet</code> is ordered and the ordering is\ndeterministic. This requires that the ordering includes a field\n(or set of fields) that is unique and non-nullable.</p>\n<p>For queries involving a <code class=\"docutils literal notranslate\">GROUP BY</code> clause, the model's default\nordering is ignored. Ordering specified via <code class=\"docutils literal notranslate\">.extra(order_by=...)</code>\nis also ignored.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.db\">\n<span class=\"sig-name descname\">db</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.db\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果现在执行这个查询，将使用的数据库。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 的 <code class=\"docutils literal notranslate\">query</code> 参数的存在是为了让专门的查询子类能够重建内部查询状态。该参数的值是该查询状态的不透明表示，不是公共 API 的一部分。</p>\n</aside>\n</dd></dl>\n\n<section id=\"methods-that-return-new-querysets\">\n<h3>返回新 <code class=\"docutils literal notranslate\">QuerySet</code> 的方法<a class=\"heading-anchor\" href=\"#methods-that-return-new-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 提供了一系列的 <code class=\"docutils literal notranslate\">QuerySet</code> 细化方法，这些方法可以修改 <code class=\"docutils literal notranslate\">QuerySet</code> 返回的结果类型或其 SQL 查询的执行方式。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>这些方法不运行数据库查询，因此它们 <strong>可以安全地在异步代码中运行</strong>，而且没有单独的异步版本。</p>\n</aside>\n<section id=\"filter\">\n<h4><code class=\"docutils literal notranslate\">filter()</code><a class=\"heading-anchor\" href=\"#filter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.filter\">\n<span class=\"sig-name descname\">filter</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.filter\"><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\">QuerySet</code>，其中包含与给定查找参数相匹配的对象。</p>\n<p>查询参数（<code class=\"docutils literal notranslate\">**kwargs</code>）的格式应在下文 <a class=\"reference internal\" href=\"#id4\">Field lookups</a> 中描述。多个参数通过底层 SQL 语句中的 <code class=\"docutils literal notranslate\">AND</code> 连接。</p>\n<p>If you need to execute more complex queries (for example, queries with <code class=\"docutils literal notranslate\">OR</code>\nstatements), you can use <a class=\"reference internal\" href=\"#q-objects\"><span class=\"std std-ref\">Q() 对象</span></a> (<code class=\"docutils literal notranslate\">*args</code>).</p>\n<aside class=\"admonition-null-values-and-three-valued-logic admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">NULL</code> values and three-valued logic</p>\n<p>When passing a <code class=\"docutils literal notranslate\">QuerySet</code> to the <a class=\"reference internal\" href=\"#std-fieldlookup-in\"><code class=\"xref std std-lookup docutils literal notranslate\">in</code></a> lookup, ensure the\nsubquery does not return <code class=\"docutils literal notranslate\">NULL</code> values. See <a class=\"reference internal\" href=\"#null-and-three-valued-logic\"><span class=\"std std-ref\">this note</span></a> for details.</p>\n</aside>\n</section>\n<section id=\"exclude\">\n<h4><code class=\"docutils literal notranslate\">exclude()</code><a class=\"heading-anchor\" href=\"#exclude\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.exclude\">\n<span class=\"sig-name descname\">exclude</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.exclude\"><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\">QuerySet</code>，其中包含与给定查找参数不匹配的对象。</p>\n<p>查询参数（<code class=\"docutils literal notranslate\">**kwargs</code>）的格式应在下文 <a class=\"reference internal\" href=\"#id4\">Field lookups</a> 中描述。多个参数通过底层 SQL 语句中的 <code class=\"docutils literal notranslate\">AND</code> 连接，整个过程用 <code class=\"docutils literal notranslate\">NOT()</code> 括起来。</p>\n<p>这个例子排除了所有 <code class=\"docutils literal notranslate\">pub_date</code> 晚于 2005-1-3 且 <code class=\"docutils literal notranslate\">headline</code> 为“Hello”的条目：</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>exclude<span class=\"p\">(</span>pub_date__gt<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">),</span> headline<span class=\"o\">=</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span>\n<span class=\"k\">WHERE</span> <span class=\"k\">NOT</span> <span class=\"p\">(</span>pub_date <span class=\"o\">&gt;</span> <span class=\"s1\">&#39;2005-1-3&#39;</span> <span class=\"k\">AND</span> headline <span class=\"o\">=</span> <span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这个例子不包括所有 <code class=\"docutils literal notranslate\">pub_date</code> 晚于 2005-1-3 或 <code class=\"docutils literal notranslate\">headline</code> 为“Hello”的条目：</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>exclude<span class=\"p\">(</span>pub_date__gt<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">))</span><span class=\"o\">.</span>exclude<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span>\n<span class=\"k\">WHERE</span> <span class=\"k\">NOT</span> pub_date <span class=\"o\">&gt;</span> <span class=\"s1\">&#39;2005-1-3&#39;</span>\n<span class=\"k\">AND</span> <span class=\"k\">NOT</span> headline <span class=\"o\">=</span> <span class=\"s1\">&#39;Hello&#39;</span>\n</code></pre></div>\n<p>请注意，第二个例子的限制性更强。</p>\n<p>如果你需要执行更复杂的查询（例如，带有 <code class=\"docutils literal notranslate\">OR</code> 语句的查询），你可以使用 <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q 对象</code></a> （<code class=\"docutils literal notranslate\">*args</code>）。</p>\n<aside class=\"admonition-null-values-and-three-valued-logic admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">NULL</code> values and three-valued logic</p>\n<p>When passing a <code class=\"docutils literal notranslate\">QuerySet</code> to the <a class=\"reference internal\" href=\"#std-fieldlookup-in\"><code class=\"xref std std-lookup docutils literal notranslate\">in</code></a> lookup, ensure the\nsubquery does not return <code class=\"docutils literal notranslate\">NULL</code> values. See <a class=\"reference internal\" href=\"#null-and-three-valued-logic\"><span class=\"std std-ref\">this note</span></a> for details.</p>\n</aside>\n</section>\n<section id=\"annotate\">\n<h4><code class=\"docutils literal notranslate\">annotate()</code><a class=\"heading-anchor\" href=\"#annotate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.annotate\">\n<span class=\"sig-name descname\">annotate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.annotate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Annotates each object in the <code class=\"docutils literal notranslate\">QuerySet</code> with the provided list of <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/\"><span class=\"doc\">query\nexpressions</span></a> or <a class=\"reference internal\" href=\"#q-objects\"><span class=\"std std-ref\">Q() 对象</span></a>. Each object can be\nannotated with:</p>\n<ul class=\"simple\">\n<li><p>a simple value,  via <code class=\"docutils literal notranslate\">Value()</code>;</p></li>\n<li><p>a reference to a field on the model (or any related models), via <code class=\"docutils literal notranslate\">F()</code>;</p></li>\n<li><p>a boolean, via <code class=\"docutils literal notranslate\">Q()</code>; or</p></li>\n<li><p>a result from an aggregate expression (averages, sums, etc.) computed over\nthe objects that are related to the objects in the <code class=\"docutils literal notranslate\">QuerySet</code>.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">annotate()</code> 的每个参数都是一个注解，将被添加到返回的 <code class=\"docutils literal notranslate\">QuerySet</code> 中的每个对象。</p>\n<p>Django 提供的聚合函数在下面的 <a class=\"reference internal\" href=\"#id6\">聚合函数</a> 中介绍。</p>\n<p>使用关键字参数指定的注解将使用关键字作为注解的别名。匿名参数将根据聚合函数的名称和被聚合的模型字段为其生成一个别名。只有引用单个字段的聚合表达式才能成为匿名参数。其他一切都必须是关键字参数。</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> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\"># The name of the first blog</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>name\n<span class=\"go\">&#39;Blogasaurus&#39;</span>\n<span class=\"go\"># The number of entries on the first blog</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>entry__count\n<span class=\"go\">42</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">Blog</code> 模型本身没有定义 <code class=\"docutils literal notranslate\">entry__count</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>q <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>number_of_entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\"># The number of entries on the first blog, using the name provided</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>number_of_entries\n<span class=\"go\">42</span>\n</code></pre></div>\n<p>关于聚合的深入讨论，见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/aggregation/\"><span class=\"doc\">关于聚合的专题指南</span></a>。</p>\n</section>\n<section id=\"alias\">\n<h4><code class=\"docutils literal notranslate\">alias()</code><a class=\"heading-anchor\" href=\"#alias\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.alias\">\n<span class=\"sig-name descname\">alias</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.alias\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>与 <a class=\"reference internal\" href=\"#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> 相同，但不是注解中的 <code class=\"docutils literal notranslate\">QuerySet</code> 对象，而是保存表达式，以便以后与其他 <code class=\"docutils literal notranslate\">QuerySet</code> 方法重复使用。当不需要表达式本身的结果，但用于过滤、排序或作为复杂表达式的一部分时，这很有用。不查找未使用的值可以从数据库中移除多余的工作，这应该会带来更好的性能。</p>\n<p>例如，如果你想查找具有超过 5 条条目的博客，但不关心具体的条目数量，你可以这样做：</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> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>blogs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>alias<span class=\"p\">(</span>entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>entries__gt<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">alias()</code> can be used in conjunction with <a class=\"reference internal\" href=\"#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>, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a>,\n<a class=\"reference internal\" href=\"#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=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a>, and <a class=\"reference internal\" href=\"#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>. To use an aliased\nexpression with other methods (e.g. <a class=\"reference internal\" href=\"#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>), you must promote it to\nan annotation:</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>alias<span class=\"p\">(</span>entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n    entries<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;entries&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span><span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Sum<span class=\"p\">(</span><span class=\"s2\">&quot;entries&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#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> and <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> can take expressions directly, but\nexpression construction and usage often does not happen in the same place (for\nexample, <code class=\"docutils literal notranslate\">QuerySet</code> method creates expressions, for later use in views).\n<code class=\"docutils literal notranslate\">alias()</code> allows building complex expressions incrementally (possibly\nspanning multiple methods and modules), referring to the expression parts by\ntheir aliases, and only using <a class=\"reference internal\" href=\"#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> for the final result.</p>\n</section>\n<section id=\"order-by\">\n<h4><code class=\"docutils literal notranslate\">order_by()</code><a class=\"heading-anchor\" href=\"#order-by\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.order_by\">\n<span class=\"sig-name descname\">order_by</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.order_by\"><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\">QuerySet</code> 返回的结果是按照模型 <code class=\"docutils literal notranslate\">Meta</code> 中的 <code class=\"docutils literal notranslate\">ordering</code> 选项给出的排序元组排序的。你可以通过使用 <code class=\"docutils literal notranslate\">order_by</code> 方法在每个 <code class=\"docutils literal notranslate\">QuerySet</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>上述结果将按 <code class=\"docutils literal notranslate\">pub_date</code> 降序排列，然后按 <code class=\"docutils literal notranslate\">headline</code> 升序排列。<code class=\"docutils literal notranslate\">&quot;-pub_date&quot;</code> 前面的负号表示 <em>降序</em>。升序是隐含的。要随机排序，使用 <code class=\"docutils literal notranslate\">&quot;?&quot;</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;?&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>注意：<code class=\"docutils literal notranslate\">order_by('?')</code> 查询可能会很贵，而且速度很慢，这取决于你使用的数据库后端。</p>\n<p>要按不同模型中的字段排序，使用与跨模型关系查询时相同的语法。也就是说，字段的名称，后面是双下划线（<code class=\"docutils literal notranslate\">__</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你试图通过与另一个模型有关系的字段进行排序，Django 将使用相关模型上的默认排序，如果没有指定 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.ordering</code></a>，则通过相关模型的主键进行排序。例如，由于 <code class=\"docutils literal notranslate\">Blog</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;blog&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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;blog__id&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\">Blog</code> 有 <code class=\"docutils literal notranslate\">ordering = ['name']</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你也可以通过在表达式上调用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">asc()</code></a> 或 <code class=\"xref py py-meth docutils literal notranslate\">esc()</code>，按 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>Coalesce<span class=\"p\">(</span><span class=\"s2\">&quot;summary&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">())</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\">asc()</code></a> 和 <code class=\"xref py py-meth docutils literal notranslate\">esc()</code> 有参数（<code class=\"docutils literal notranslate\">nulls_first</code> 和 <code class=\"docutils literal notranslate\">nulls_last</code>）来控制如何对空值进行排序。</p>\n<p>Be cautious when ordering by fields in related models if you are also using\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">distinct()</code></a>. See the note in <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">distinct()</code></a> for an explanation of how\nrelated model ordering can change the expected results.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>允许指定一个多值字段来对结果进行排序（例如，一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> 字段，或者一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> 字段的反向关系）。</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\">Event</span><span class=\"p\">(</span>Model<span class=\"p\">):</span>\n    parent <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;self&quot;</span><span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s2\">&quot;children&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n\n\nEvent<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;children__date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在这里，每个 <code class=\"docutils literal notranslate\">Event</code> 可能有多个排序数据；每个 <code class=\"docutils literal notranslate\">Event</code> 有多个 <code class=\"docutils literal notranslate\">children</code> 将被多次返回到 <code class=\"docutils literal notranslate\">order_by()</code> 创建的新 <code class=\"docutils literal notranslate\">QuerySet</code> 中。换句话说，在 <code class=\"docutils literal notranslate\">QuerySet</code> 上使用 <code class=\"docutils literal notranslate\">order_by()</code> 可能会返回比你一开始工作更多的项目——这可能既不是预期的，也不是有用的。</p>\n<p>因此，在使用多值字段对结果进行排序时要注意。<strong>如果</strong> 你能确定你要订购的每个项目只有一个订购数据，这种方法应该不会出现问题。如果不是，请确保结果是你所期望的。</p>\n</aside>\n<p>没有办法指定排序是否应该区分大小写。关于大小写敏感，Django 会按照数据库后台的正常排序方式来排序。</p>\n<p>你可以用 <code class=\"xref py py-class docutils literal notranslate\">Lower</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">())</span>\n</code></pre></div>\n<p>If you don't want any ordering to be applied to a query, not even the default\nordering, call <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> with no parameters.</p>\n<p>你可以通过检查 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.ordered\" title=\"django.db.models.query.QuerySet.ordered\"><code class=\"xref py py-attr docutils literal notranslate\">QuerySet.ordered</code></a> 属性来判断一个查询是否被排序，如果 <code class=\"docutils literal notranslate\">QuerySet</code> 以任何方式被排序，则该属性为 <code class=\"docutils literal notranslate\">True</code>。</p>\n<p>每次 <code class=\"docutils literal notranslate\">order_by()</code> 调用都将清除以前的任何排序。例如，此查询将按 <code class=\"docutils literal notranslate\">pub_date</code> 而不是 <code class=\"docutils literal notranslate\">headline</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>排序不是一个免费的操作。你添加到排序中的每个字段都会给你的数据库带来成本。你添加的每个外键都会隐式地包含其所有的默认排序。</p>\n<p>如果查询没有指定顺序，那么结果将以未指定的顺序从数据库中返回。只有当按一组字段排序时，才能保证特定的排序，这些字段唯一地标识结果中的每个对象。例如，如果 <code class=\"docutils literal notranslate\">name</code> 字段不是唯一的，那么按它排序就不能保证具有相同名称的对象总是以相同的顺序出现。</p>\n</aside>\n</section>\n<section id=\"reverse\">\n<h4>reverse()<a class=\"heading-anchor\" href=\"#reverse\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.reverse\">\n<span class=\"sig-name descname\">reverse</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.reverse\"><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\">reverse()</code> 方法来反向返回查询集元素的顺序。第二次调用 <code class=\"docutils literal notranslate\">reverse()</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>my_queryset<span class=\"o\">.</span>reverse<span class=\"p\">()[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>请注意，这与 Python 中从一个序列的末尾切分不太一样。上面的例子会先返回最后一项，然后返回倒数第二项，以此类推。如果我们有一个 Python 序列，看 <code class=\"docutils literal notranslate\">seq[-5:]</code>，我们会先看到倒数第五项。Django 不支持这种访问模式（从末尾切分），因为在 SQL 中不可能有效地做到这一点。</p>\n<p>Also, note that <code class=\"docutils literal notranslate\">reverse()</code> should generally only be called on a <code class=\"docutils literal notranslate\">QuerySet</code>\nwhich has a defined ordering (e.g., when querying against a model which defines\na default ordering, or when using <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a>). If no such ordering is\ndefined for a given <code class=\"docutils literal notranslate\">QuerySet</code>, calling <code class=\"docutils literal notranslate\">reverse()</code> on it has no real\neffect (the ordering was undefined prior to calling <code class=\"docutils literal notranslate\">reverse()</code>, and will\nremain undefined afterward).</p>\n</section>\n<section id=\"distinct\">\n<h4><code class=\"docutils literal notranslate\">distinct()</code><a class=\"heading-anchor\" href=\"#distinct\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.distinct\">\n<span class=\"sig-name descname\">distinct</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.distinct\"><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\">QuerySet</code>，在其 SQL 查询中使用 <code class=\"docutils literal notranslate\">SELECT DISTINCT</code>。这将消除查询结果中的重复记录。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">QuerySet</code> 不会消除重复的记录。在实践中，这很少是一个问题，因为简单的查询，如 <code class=\"docutils literal notranslate\">Blog.objects.all()</code> 不会引入重复结果行的可能性。但是，如果你的查询跨越了多个表，当 <code class=\"docutils literal notranslate\">QuerySet</code> 被执行时，就有可能得到重复的结果。这时就应该使用 <code class=\"docutils literal notranslate\">distinct()</code>。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> 调用中使用的任何字段都包含在 SQL <code class=\"docutils literal notranslate\">SELECT</code> 列中。当与 <code class=\"docutils literal notranslate\">distinct()</code> 结合使用时，这有时会导致意外的结果。如果按相关模型中的字段排序，这些字段将被添加到选定的列中，它们可能会使原本重复的行看起来是不同的。由于额外的列不会出现在返回的结果中（它们只是为了支持排序），所以有时看起来像是返回了非去重的结果。</p>\n<p>Similarly, if you use a <a class=\"reference internal\" href=\"#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> query to restrict the columns\nselected, the columns used in any <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> (or default model\nordering) will still be involved and may affect uniqueness of the results.</p>\n<p>The moral here is that if you are using <code class=\"docutils literal notranslate\">distinct()</code> be careful about\nordering by related models. Similarly, when using <code class=\"docutils literal notranslate\">distinct()</code> and\n<a class=\"reference internal\" href=\"#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> together, be careful when ordering by fields not in the\n<a class=\"reference internal\" href=\"#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> call.</p>\n</aside>\n<p>仅在 PostgreSQL 上，你可以传递位置参数（<code class=\"docutils literal notranslate\">*fields</code>），以指定 <code class=\"docutils literal notranslate\">DISTINCT</code> 应适用的字段名称。这相当于一个 <code class=\"docutils literal notranslate\">SELECT DISTINCT ON</code> 的 SQL 查询。这其中的区别是，对于普通的 <code class=\"docutils literal notranslate\">distinct()</code> 调用，数据库在确定哪些行是不同的时候，会比较每行中的 <em>每个</em> 字段。对于带有指定字段名的 <code class=\"docutils literal notranslate\">distinct()</code> 调用，数据库将只比较指定的字段名。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当你指定字段名时，你 <em>必须</em> 在 <code class=\"docutils literal notranslate\">QuerySet</code> 中提供一个 <code class=\"docutils literal notranslate\">order_by()</code>，而且 <code class=\"docutils literal notranslate\">order_by()</code> 中的字段必须以 <code class=\"docutils literal notranslate\">distinct()</code> 中的字段开始，顺序相同。</p>\n<p>例如，<code class=\"docutils literal notranslate\">SELECT DISTINCT ON (a)</code> 给出了列 <code class=\"docutils literal notranslate\">a</code> 中每个值的第一行。如果你不指定顺序，你会得到一些任意的行。</p>\n</aside>\n<p>示例（在第一个示例之后，只能在 PostgreSQL 上运行）：</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>distinct<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mod_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mod_date&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [...]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>请记住 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> 使用任何已经定义的默认相关模型排序。你可能必须明确地按关系 <code class=\"docutils literal notranslate\">_id</code> 或引用字段排序，以确保 <code class=\"docutils literal notranslate\">DISTINCT ON</code> 表达式与 <code class=\"docutils literal notranslate\">ORDER BY</code> 子句开头的表达式匹配。例如，如果 <code class=\"docutils literal notranslate\">Blog</code> 模型定义了一个通过 <code class=\"docutils literal notranslate\">name</code> 进行 <code class=\"xref py py-attr docutils literal notranslate\"> ordering</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>distinct<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...这是不可行的，因为查询将按 <code class=\"docutils literal notranslate\">blog__name</code> 排序，从而与 <code class=\"docutils literal notranslate\">DISTINCT ON</code> 表达式不匹配。你必须明确地按关系 <code class=\"docutils literal notranslate\">_id</code> 字段（本例中为 <code class=\"docutils literal notranslate\">blog_id</code>）或被引用的字段（<code class=\"docutils literal notranslate\">blog__pk</code>）排序，以确保两个表达式匹配。</p>\n</aside>\n</section>\n<section id=\"values\">\n<h4><code class=\"docutils literal notranslate\">values()</code><a class=\"heading-anchor\" href=\"#values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.values\">\n<span class=\"sig-name descname\">values</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em>, <em class=\"sig-param\"><span class=\"o\">**</span>expressions</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.values\"><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\">QuerySet</code>，当用作可迭代对象时，返回字典，而不是模型实例。</p>\n<p>其中每一个字典都代表一个对象，键与模型对象的属性名相对应。</p>\n<p>这个示例比较了 <code class=\"docutils literal notranslate\">values()</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=\"go\"># This list contains a Blog object.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Beatles&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Blog: Beatles Blog&gt;]&gt;</span>\n\n<span class=\"go\"># This list contains a dictionary.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Beatles&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>values<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;, &#39;tagline&#39;: &#39;All the latest Beatles news.&#39;}]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">values()</code> 方法接受可选的位置参数 <code class=\"docutils literal notranslate\">*fields</code>，它指定了 <code class=\"docutils literal notranslate\">SELECT</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;, &#39;tagline&#39;: &#39;All the latest Beatles news.&#39;}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;}]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">values()</code> 方法还接受可选的关键字参数 <code class=\"docutils literal notranslate\">**expressions</code>，这些参数将传递给 <a class=\"reference internal\" href=\"#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<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.functions</span> <span class=\"kn\">import</span> Lower\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span>lower_name<span class=\"o\">=</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;lower_name&#39;: &#39;beatles blog&#39;}]&gt;</span>\n</code></pre></div>\n<p>你可以在排序中使用内置和 <a class=\"reference internal\" href=\"/zh-hans/6.1/howto/custom-lookups/\"><span class=\"doc\">自定义查找</span></a>。例如：</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> 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> Lower\n<span class=\"gp\">&gt;&gt;&gt; </span>CharField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>Lower<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;name__lower&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;name__lower&#39;: &#39;beatles blog&#39;}]&gt;</span>\n</code></pre></div>\n<p>在 <code class=\"docutils literal notranslate\">values()</code> 子句内部的聚合在同一 <code class=\"docutils literal notranslate\">values()</code> 子句内的其他参数之前应用。如果需要按另一个值进行分组，请将其添加到较早的 <code class=\"docutils literal notranslate\">values()</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> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors&quot;</span><span class=\"p\">,</span> entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors&#39;: 1, &#39;entries&#39;: 20}, {&#39;entry__authors&#39;: 1, &#39;entries&#39;: 13}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors&#39;: 1, &#39;entries&#39;: 33}]&gt;</span>\n</code></pre></div>\n<p>有几个微妙的地方值得一提：</p>\n<ul>\n<li><p>如果你有一个名为 <code class=\"docutils literal notranslate\">foo</code> 的字段是一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>，默认的 <code class=\"docutils literal notranslate\">values()</code> 调用将返回一个名为 <code class=\"docutils literal notranslate\">foo_id</code> 的字典键，因为这是存储实际值的隐藏模型属性的名称（<code class=\"docutils literal notranslate\">foo</code> 属性指的是相关模型）。当你调用 <code class=\"docutils literal notranslate\">values()</code> 并传递字段名时，你可以传递 <code class=\"docutils literal notranslate\">foo</code> 或 <code class=\"docutils literal notranslate\">foo_id</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog_id&#39;: 1, &#39;headline&#39;: &#39;First Entry&#39;, ...}, ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog&#39;: 1}, ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;blog_id&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog_id&#39;: 1}, ...]&gt;</span>\n</code></pre></div>\n</li>\n<li><p>When using <code class=\"docutils literal notranslate\">values()</code> together with <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">distinct()</code></a>, be aware that\nordering can affect the results. See the note in <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">distinct()</code></a> for\ndetails.</p></li>\n<li><p>If you use a <code class=\"docutils literal notranslate\">values()</code> clause after an <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\">extra()</code></a> call,\nany fields defined by a <code class=\"docutils literal notranslate\">select</code> argument in the <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\">extra()</code></a> must\nbe explicitly included in the <code class=\"docutils literal notranslate\">values()</code> call. Any <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\">extra()</code></a> call\nmade after a <code class=\"docutils literal notranslate\">values()</code> call will have its extra selected fields\nignored.</p></li>\n<li><p>Calling <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\">only()</code></a> and <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\">defer()</code></a> after <code class=\"docutils literal notranslate\">values()</code> doesn't make\nsense, so doing so will raise a <code class=\"docutils literal notranslate\">TypeError</code>.</p></li>\n<li><p>组合转换和聚合需要使用两个 <a class=\"reference internal\" href=\"#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> 调用，可以显式地使用它们，也可以作为 <a class=\"reference internal\" href=\"#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=\"#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<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> CharField<span class=\"p\">,</span> Count\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> Lower\n<span class=\"gp\">&gt;&gt;&gt; </span>CharField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>Lower<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors__name__lower&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span>entry__authors__name__lower<span class=\"o\">=</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors__name&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>entry__authors__name__lower<span class=\"o\">=</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors__name&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>values<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;entry__authors__name__lower&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>entries<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n</code></pre></div>\n</li>\n</ul>\n<p>当你知道你只需要一小部分可用字段的值，而且你不需要模型实例对象的功能时，它就很有用。只选择你需要使用的字段会更高效。</p>\n<p>最后要注意的是，你可以在调用 <code class=\"docutils literal notranslate\">values()</code> 之后调用 <code class=\"docutils literal notranslate\">filter()</code>、<code class=\"docutils literal notranslate\">order_by()</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">()</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\nBlog<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>values<span class=\"p\">()</span>\n</code></pre></div>\n<p>制作 Django 的人喜欢把所有影响 SQL 的方法放在前面，后面（可选的）是任何影响输出的方法（比如 <code class=\"docutils literal notranslate\">values()</code>），但这并不重要。这是你真正炫耀自己个性的机会。</p>\n<p>你还可以通过 <code class=\"docutils literal notranslate\">OneToOneField</code>、<code class=\"docutils literal notranslate\">ForeignKey</code> 和 <code class=\"docutils literal notranslate\">ManyToManyField</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;entry__headline&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;name&#39;: &#39;My blog&#39;, &#39;entry__headline&#39;: &#39;An entry&#39;},</span>\n<span class=\"go\">     {&#39;name&#39;: &#39;My blog&#39;, &#39;entry__headline&#39;: &#39;Another entry&#39;}, ...]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>因为 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> 属性和逆向关系可以有多条相关的记录，包括这些可以对你的结果集的大小产生倍增效应。如果你在你的 <code class=\"docutils literal notranslate\">values()</code> 查询中包含了多个这样的字段，这一点会特别明显，在这种情况下，所有可能的组合都会被返回。</p>\n</aside>\n<aside class=\"admonition-special-values-for-jsonfield-on-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 的 <code class=\"docutils literal notranslate\">JSONField</code> 具有一些特殊的值</p>\n<p>由于 SQLite 上实现了 <code class=\"docutils literal notranslate\">JSON_EXTRACT</code> 和 <code class=\"docutils literal notranslate\">JSON_TYPE</code> SQL 函数的方式以及缺少 <code class=\"docutils literal notranslate\">BOOLEAN</code> 数据类型，<code class=\"docutils literal notranslate\">values()</code> 将为 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> 键转换返回 <code class=\"docutils literal notranslate\">True</code>、<code class=\"docutils literal notranslate\">False</code> 和 <code class=\"docutils literal notranslate\">None</code>，而不是 <code class=\"docutils literal notranslate\">&quot;true&quot;</code>、<code class=\"docutils literal notranslate\">&quot;false&quot;</code> 和 <code class=\"docutils literal notranslate\">&quot;null&quot;</code> 字符串。</p>\n</aside>\n</section>\n<section id=\"values-list\">\n<h4><code class=\"docutils literal notranslate\">values_list()</code><a class=\"heading-anchor\" href=\"#values-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.values_list\">\n<span class=\"sig-name descname\">values_list</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em>, <em class=\"sig-param\">flat<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">named<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.values_list\"><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\">values()</code> 类似，不同之处在于在迭代时，它返回元组而不是字典。每个元组包含传递给 <code class=\"docutils literal notranslate\">values_list()</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;First entry&#39;), ...]&gt;</span>\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> Lower\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> Lower<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;first entry&#39;), ...]&gt;</span>\n</code></pre></div>\n<p>如果只传入一个字段，你还可以传递 <code class=\"docutils literal notranslate\">flat</code> 参数。如果设置为 <code class=\"docutils literal notranslate\">True</code>，则返回的结果将是单个值，而不是 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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet[(1,), (2,), (3,), ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> flat<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [1, 2, 3, ...]&gt;</span>\n</code></pre></div>\n<p>当有多个字段时，传入 <code class=\"docutils literal notranslate\">flat</code> 是错误的。</p>\n<p>你可以传递 <code class=\"docutils literal notranslate\">named=True</code> 以将结果作为 <a class=\"reference external\" href=\"https://docs.python.org/3/library/collections.html#collections.namedtuple\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\">namedtuple()</code></a> 返回：</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> named<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [Row(id=1, headline=&#39;First entry&#39;), ...]&gt;</span>\n</code></pre></div>\n<p>使用命名元组可能会使使用结果更易读，但代价是将结果转化为命名元组时要付出很小的性能代价。</p>\n<p>如果你不向 <code class=\"docutils literal notranslate\">values_list()</code> 传递任何值，它将按照声明的顺序返回模型中的所有字段。</p>\n<p>一个常见的需求是获取特定模型实例的特定字段值。要实现这一点，使用 <code class=\"docutils literal notranslate\">values_list()</code> 后跟一个 <code class=\"docutils literal notranslate\">get()</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> flat<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;First entry&#39;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">values()</code> 和 <code class=\"docutils literal notranslate\">values_list()</code> 都是针对特定用例的优化：检索数据的子集，而不需要创建一个模型实例的开销。当处理多对多和其他多值关系（如反向外键的一对多关系）时，这个隐喻就失效了，因为“一行一对象”的假设不成立。</p>\n<p>例如，请注意在查询跨越 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> 时的行为：</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>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;entry__headline&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Noam Chomsky&#39;, &#39;Impressions of Gaza&#39;),</span>\n<span class=\"go\"> (&#39;George Orwell&#39;, &#39;Why Socialists Do Not Believe in Fun&#39;),</span>\n<span class=\"go\"> (&#39;George Orwell&#39;, &#39;In Defence of English Cooking&#39;),</span>\n<span class=\"go\"> (&#39;Don Quixote&#39;, None)]&gt;</span>\n</code></pre></div>\n<p>有多个条目的作者出现多次，没有任何条目的作者的条目标题为 <code class=\"docutils literal notranslate\">None</code>。</p>\n<p>类似地，当查询反向外键时，对于没有任何作者的条目，会显示为 <code class=\"docutils literal notranslate\">None</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Noam Chomsky&#39;,), (&#39;George Orwell&#39;,), (None,)]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-special-values-for-jsonfield-on-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 的 <code class=\"docutils literal notranslate\">JSONField</code> 具有一些特殊的值</p>\n<p>由于 SQLite 上实现了 <code class=\"docutils literal notranslate\">JSON_EXTRACT</code> 和 <code class=\"docutils literal notranslate\">JSON_TYPE</code> SQL 函数的方式以及缺少 <code class=\"docutils literal notranslate\">BOOLEAN</code> 数据类型，<code class=\"docutils literal notranslate\">values_list()</code> 将为 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> 键转换返回 <code class=\"docutils literal notranslate\">True</code>、<code class=\"docutils literal notranslate\">False</code> 和 <code class=\"docutils literal notranslate\">None</code>，而不是 <code class=\"docutils literal notranslate\">&quot;true&quot;</code>、<code class=\"docutils literal notranslate\">&quot;false&quot;</code> 和 <code class=\"docutils literal notranslate\">&quot;null&quot;</code> 字符串。</p>\n</aside>\n</section>\n<section id=\"dates\">\n<h4><code class=\"docutils literal notranslate\">dates()</code><a class=\"heading-anchor\" href=\"#dates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.dates\">\n<span class=\"sig-name descname\">dates</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field</em>, <em class=\"sig-param\">kind</em>, <em class=\"sig-param\">order<span class=\"o\">=</span><span class=\"default_value\">'ASC'</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.dates\"><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\">QuerySet</code>，它的值是一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.date</code></a> 对象的列表，代表 <code class=\"docutils literal notranslate\">QuerySet</code> 内容中所有可用的特定日期。</p>\n<p><code class=\"docutils literal notranslate\">field</code> 应该是你的模型的 <code class=\"docutils literal notranslate\">DateField</code> 的名称。<code class=\"docutils literal notranslate\">kind</code> 应该是``&quot;year&quot;<code class=\"docutils literal notranslate\">、</code>&quot;month&quot;<code class=\"docutils literal notranslate\">、</code>&quot;week&quot;`` 或 <code class=\"docutils literal notranslate\">&quot;day&quot;</code>。结果列表中的每个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.date</code></a> 对象都被“截断”为给定的` type`。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">&quot;year&quot;</code> 返回字段的所有不同年份值的列表。</p></li>\n<li><p><code class=\"docutils literal notranslate\">&quot;month&quot;</code> 返回该字段所有不同年／月值的列表。</p></li>\n<li><p><code class=\"docutils literal notranslate\">&quot;week&quot;</code> 返回该字段的所有不同年份／星期值的列表。所有日期都是星期一。</p></li>\n<li><p><code class=\"docutils literal notranslate\">&quot;day&quot;</code> 返回该字段的所有不同年／月／日值的列表。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">order</code>，默认为 <code class=\"docutils literal notranslate\">'ASC'</code>，应该是 <code class=\"docutils literal notranslate\">'ASC'</code> 或 <code class=\"docutils literal notranslate\">'DESC'</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>dates<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;year&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 1, 1)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>dates<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;month&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 1), datetime.date(2005, 3, 1)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>dates<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;week&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 14), datetime.date(2005, 3, 14)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>dates<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 20), datetime.date(2005, 3, 20)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>dates<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">,</span> order<span class=\"o\">=</span><span class=\"s2\">&quot;DESC&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 3, 20), datetime.date(2005, 2, 20)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>dates<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 3, 20)]</span>\n</code></pre></div>\n</section>\n<section id=\"datetimes\">\n<h4><code class=\"docutils literal notranslate\">datetimes()</code><a class=\"heading-anchor\" href=\"#datetimes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.datetimes\">\n<span class=\"sig-name descname\">datetimes</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field_name</em>, <em class=\"sig-param\">kind</em>, <em class=\"sig-param\">order<span class=\"o\">=</span><span class=\"default_value\">'ASC'</span></em>, <em class=\"sig-param\">tzinfo<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.datetimes\"><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\">QuerySet</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\">QuerySet</code> 内容中所有可用的特定日期。</p>\n<p><code class=\"docutils literal notranslate\">field_name</code> 应该是你的模型中 <code class=\"docutils literal notranslate\">DateTimeField</code> 的名称。</p>\n<p><code class=\"docutils literal notranslate\">kind</code> 应该是 <code class=\"docutils literal notranslate\">&quot;year&quot;</code>、<code class=\"docutils literal notranslate\">&quot;month&quot;</code>、<code class=\"docutils literal notranslate\">&quot;week&quot;</code>、<code class=\"docutils literal notranslate\">&quot;day&quot;</code>、<code class=\"docutils literal notranslate\">&quot;hour&quot;</code>、<code class=\"docutils literal notranslate\">&quot;minute&quot;</code> 或 <code class=\"docutils literal notranslate\">&quot;second&quot;</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\">type</code>。</p>\n<p><code class=\"docutils literal notranslate\">order</code>，默认为 <code class=\"docutils literal notranslate\">'ASC'</code>，应该是 <code class=\"docutils literal notranslate\">'ASC'</code> 或 <code class=\"docutils literal notranslate\">'DESC'</code>。这指定了如何对结果进行排序。</p>\n<p><code class=\"docutils literal notranslate\">tzinfo</code> 定义了在截断之前将日期时间转换为的时区。事实上，一个给定的日期时间根据使用的时区有不同的表示方式。这个参数必须是一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.tzinfo\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.tzinfo</code></a> 对象。如果是 <code class=\"docutils literal notranslate\">None</code>，Django 会使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/i18n/timezones/#default-current-time-zone\"><span class=\"std std-ref\">current time zone</span></a>。当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">False</code> 时，它没有效果。</p>\n<aside class=\"admonition admonition-note\" id=\"database-time-zone-definitions\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>这个函数直接在数据库中执行时区转换。因此，你的数据库必须能够解释 <code class=\"docutils literal notranslate\">tzinfo.tzname(None)</code> 的值。这就转化为以下要求：</p>\n<ul class=\"simple\">\n<li><p>SQLite：没有要求。转换是在 Python 中进行的。</p></li>\n<li><p>PostgreSQL：无要求（见 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-TIMEZONES\">Time Zones</a> ）。</p></li>\n<li><p>Oracle：无要求（见 <a class=\"reference external\" href=\"https://docs.oracle.com/en/database/oracle/oracle-database/18/nlspg/datetime-data-types-and-time-zone-support.html#GUID-805AB986-DE12-4FEA-AF56-5AABCD2132DF\">Choosing a Time Zone File</a> ）。</p></li>\n<li><p>MySQL：用 <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html\">mysql_tzinfo_to_sql</a> 加载时区表。</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"none\">\n<h4><code class=\"docutils literal notranslate\">none()</code><a class=\"heading-anchor\" href=\"#none\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.none\">\n<span class=\"sig-name descname\">none</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.none\"><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\">none()</code> 将创建一个永远不会返回任何对象的查询集，在访问结果时将不执行任何查询。<code class=\"docutils literal notranslate\">qs.none()</code> 查询集是 <code class=\"docutils literal notranslate\">EmptyQuerySet</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>none<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models.query</span> <span class=\"kn\">import</span> EmptyQuerySet\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">isinstance</span><span class=\"p\">(</span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>none<span class=\"p\">(),</span> EmptyQuerySet<span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n</section>\n<section id=\"all\">\n<h4><code class=\"docutils literal notranslate\">all()</code><a class=\"heading-anchor\" href=\"#all\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.all\">\n<span class=\"sig-name descname\">all</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.all\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Returns a <em>copy</em> of the current <code class=\"docutils literal notranslate\">QuerySet</code> (or <code class=\"docutils literal notranslate\">QuerySet</code> subclass). This\ncan be useful in situations where you might want to pass in either a model\nmanager or a <code class=\"docutils literal notranslate\">QuerySet</code> and do further filtering on the result. After calling\n<code class=\"docutils literal notranslate\">all()</code> on either object, you'll definitely have a <code class=\"docutils literal notranslate\">QuerySet</code> to work with.</p>\n<p>当一个 <code class=\"docutils literal notranslate\">QuerySet</code> 被 <a class=\"reference internal\" href=\"#when-querysets-are-evaluated\"><span class=\"std std-ref\">执行</span></a> 时，它通常会缓存其结果。如果数据库中的数据可能在 <code class=\"docutils literal notranslate\">QuerySet</code> 被评估后发生了变化，你可以通过调用 <code class=\"docutils literal notranslate\">all()</code> 对以前执行过的 <code class=\"docutils literal notranslate\">QuerySet</code> 进行更新。</p>\n</section>\n<section id=\"union\">\n<h4><code class=\"docutils literal notranslate\">union()</code><a class=\"heading-anchor\" href=\"#union\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.union\">\n<span class=\"sig-name descname\">union</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>other_qs</em>, <em class=\"sig-param\">all<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.union\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\">UNION</code> 操作符来组合两个或多个 <code class=\"docutils literal notranslate\">QuerySet</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=\"gp\">&gt;&gt;&gt; </span>qs1<span class=\"o\">.</span>union<span class=\"p\">(</span>qs2<span class=\"p\">,</span> qs3<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">UNION</code> 操作符默认只选择不同的值。要允许重复的值，使用 <code class=\"docutils literal notranslate\">all=True</code> 参数。</p>\n<p><code class=\"docutils literal notranslate\">union()</code>, <code class=\"docutils literal notranslate\">intersection()</code>, 和 <code class=\"docutils literal notranslate\">difference()</code> 返回第一个 <code class=\"docutils literal notranslate\">QuerySet</code> 类型的模型实例，即使参数是其他模型的 <code class=\"docutils literal notranslate\">QuerySet</code>。只要所有 <code class=\"docutils literal notranslate\">QuerySet</code> 中的 <code class=\"docutils literal notranslate\">SELECT</code> 列表相同（至少类型相同，名称不重要，只要类型的顺序相同），就可以传递不同的模型。在这种情况下，必须在应用于结果 <code class=\"docutils literal notranslate\">QuerySet</code> 的 <code class=\"docutils literal notranslate\">QuerySet</code> 方法中使用来自第一个 <code class=\"docutils literal notranslate\">QuerySet</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>qs1 <span class=\"o\">=</span> Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>qs2 <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>qs1<span class=\"o\">.</span>union<span class=\"p\">(</span>qs2<span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>In addition, only <code class=\"docutils literal notranslate\">LIMIT</code>, <code class=\"docutils literal notranslate\">OFFSET</code>, <code class=\"docutils literal notranslate\">COUNT(*)</code>, <code class=\"docutils literal notranslate\">ORDER BY</code>, and\nspecifying columns (i.e. slicing, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.count\" title=\"django.db.models.query.QuerySet.count\"><code class=\"xref py py-meth docutils literal notranslate\">count()</code></a>, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\">exists()</code></a>,\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a>, and <a class=\"reference internal\" href=\"#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=\"#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\">values_list()</code></a>) are allowed\non the resulting <code class=\"docutils literal notranslate\">QuerySet</code>. Further, databases place restrictions on\nwhat operations are allowed in the combined queries. For example, most\ndatabases don't allow <code class=\"docutils literal notranslate\">LIMIT</code> or <code class=\"docutils literal notranslate\">OFFSET</code> in the combined queries.</p>\n</section>\n<section id=\"intersection\">\n<h4><code class=\"docutils literal notranslate\">intersection()</code><a class=\"heading-anchor\" href=\"#intersection\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.intersection\">\n<span class=\"sig-name descname\">intersection</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>other_qs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.intersection\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\">INTERSECT</code> 操作符来返回两个或多个 <code class=\"docutils literal notranslate\">QuerySet</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>qs1<span class=\"o\">.</span>intersection<span class=\"p\">(</span>qs2<span class=\"p\">,</span> qs3<span class=\"p\">)</span>\n</code></pre></div>\n<p>一些限制见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.union\" title=\"django.db.models.query.QuerySet.union\"><code class=\"xref py py-meth docutils literal notranslate\">union()</code></a>。</p>\n</section>\n<section id=\"difference\">\n<h4><code class=\"docutils literal notranslate\">difference()</code><a class=\"heading-anchor\" href=\"#difference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.difference\">\n<span class=\"sig-name descname\">difference</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>other_qs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.difference\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\">EXCEPT</code> 运算符，只保留在一个 <code class=\"docutils literal notranslate\">QuerySet</code> 中存在而在其他某些 <code class=\"docutils literal notranslate\">QuerySet</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>qs1<span class=\"o\">.</span>difference<span class=\"p\">(</span>qs2<span class=\"p\">,</span> qs3<span class=\"p\">)</span>\n</code></pre></div>\n<p>一些限制见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.union\" title=\"django.db.models.query.QuerySet.union\"><code class=\"xref py py-meth docutils literal notranslate\">union()</code></a>。</p>\n</section>\n<section id=\"fetch-mode\">\n<h4><code class=\"docutils literal notranslate\">fetch_mode()</code><a class=\"heading-anchor\" href=\"#fetch-mode\"><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=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.fetch_mode\">\n<span class=\"sig-name descname\">fetch_mode</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">mode</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.fetch_mode\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Returns a <code class=\"docutils literal notranslate\">QuerySet</code> that sets the given fetch mode for all model instances\ncreated by this <code class=\"docutils literal notranslate\">QuerySet</code>. The fetch mode controls on-demand loading of\nfields when they are accessed, such as for foreign keys and deferred fields.\nFor example, to use the <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/fetch-modes/#django.db.models.FETCH_PEERS\" title=\"django.db.models.FETCH_PEERS\"><code class=\"xref py py-attr docutils literal notranslate\">FETCH_PEERS</code></a> mode to\nbatch-load all related objects on first access:</p>\n<div class=\"code-block\" data-language=\"python\"><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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\nbooks <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>fetch_mode<span class=\"p\">(</span>models<span class=\"o\">.</span>FETCH_PEERS<span class=\"p\">)</span>\n</code></pre></div>\n<p>See more in the <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/fetch-modes/\"><span class=\"doc\">fetch mode topic guide</span></a>.</p>\n</section>\n<section id=\"select-related\">\n<h4><code class=\"docutils literal notranslate\">select_related()</code><a class=\"heading-anchor\" href=\"#select-related\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.select_related\">\n<span class=\"sig-name descname\">select_related</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.select_related\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Returns a <code class=\"docutils literal notranslate\">QuerySet</code> that will join in the named foreign-key relationships,\nselecting additional related objects when it executes its query. This method\ncan be a performance booster, fetching data ahead of time rather than\ntriggering on-demand loading through the model instances'\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/fetch-modes/\"><span class=\"doc\">fetch mode</span></a>, at the cost of a more complex\ninitial query.</p>\n<p>下面的例子说明了普通查找和 <code class=\"docutils literal notranslate\">select_related()</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=\"c1\"># Hits the database.</span>\ne <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Hits the database again to get the related Blog object.</span>\nb <span class=\"o\">=</span> e<span class=\"o\">.</span>blog\n</code></pre></div>\n<p>这里是 <code class=\"docutils literal notranslate\">select_related</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=\"c1\"># Hits the database.</span>\ne <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Doesn&#39;t hit the database, because e.blog has been prepopulated</span>\n<span class=\"c1\"># in the previous query.</span>\nb <span class=\"o\">=</span> e<span class=\"o\">.</span>blog\n</code></pre></div>\n<p>You can use <code class=\"docutils literal notranslate\">select_related()</code> with any queryset. The order of chaining with\nother methods isn't important. For example, these querysets are equivalent:</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__gt<span class=\"o\">=</span>timezone<span class=\"o\">.</span>now<span class=\"p\">())</span><span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__gt<span class=\"o\">=</span>timezone<span class=\"o\">.</span>now<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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">City</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    hometown <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        City<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>SET_NULL<span class=\"p\">,</span>\n        blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Person<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n</code></pre></div>\n<p>Then a call to <code class=\"docutils literal notranslate\">Book.objects.select_related('author__hometown').get(id=4)</code>\nwill cache the related <code class=\"docutils literal notranslate\">Person</code> <em>and</em> the related <code class=\"docutils literal notranslate\">City</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=\"c1\"># Hits the database with joins to the author and hometown tables.</span>\nb <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;author__hometown&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>\np <span class=\"o\">=</span> b<span class=\"o\">.</span>author  <span class=\"c1\"># Doesn&#39;t hit the database.</span>\nc <span class=\"o\">=</span> p<span class=\"o\">.</span>hometown  <span class=\"c1\"># Doesn&#39;t hit the database.</span>\n\n<span class=\"c1\"># Without select_related()...</span>\nb <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>  <span class=\"c1\"># Hits the database.</span>\np <span class=\"o\">=</span> b<span class=\"o\">.</span>author  <span class=\"c1\"># Hits the database.</span>\nc <span class=\"o\">=</span> p<span class=\"o\">.</span>hometown  <span class=\"c1\"># Hits the database.</span>\n</code></pre></div>\n<p>你可以在传递给 <code class=\"docutils literal notranslate\">select_related()</code> 的字段列表中引用任何 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> 关系。</p>\n<p>你也可以在传递给 <code class=\"docutils literal notranslate\">select_related</code> 的字段列表中引用一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> 的反方向——也就是说，你可以遍历一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> 回到定义字段的对象上。不指定字段名，而是使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\">related_name</code></a> 作为相关对象上的字段。</p>\n<p>如果需要清除在过去的 <code class=\"docutils literal notranslate\">select_related</code> 调用中添加的相关字段列表，可以将 <code class=\"docutils literal notranslate\">None</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>without_relations <span class=\"o\">=</span> queryset<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>链式调用 <code class=\"docutils literal notranslate\">select_related</code> 的工作方式与其他方法类似，即 <code class=\"docutils literal notranslate\">select_related('foo', 'bar')</code> 等同于 <code class=\"docutils literal notranslate\">select_related('foo').select_related('bar')</code>。</p>\n<p>在某些情况下，你可能希望调用 <code class=\"docutils literal notranslate\">select_related()</code> 来处理很多相关对象，或者你不知道所有的关系。在这些情况下，我们可以调用 <code class=\"docutils literal notranslate\">select_related()</code>，但不使用参数。这将跟随它能找到的所有非空的外键——必须指定可空的外键。在大多数情况下，不建议这样做，因为这可能会使基础查询变得更加复杂，并返回比实际需要的更多数据。</p>\n<aside class=\"version-note version-deprecated\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 6.1</p><p><span class=\"versionmodified deprecated\">Deprecated since version 6.1: </span>Calling <code class=\"docutils literal notranslate\">select_related()</code> with no arguments is deprecated, and support\nfor it will be removed in Django 2028. Specify the fields to fetch instead.</p>\n</aside>\n</section>\n<section id=\"prefetch-related\">\n<h4><code class=\"docutils literal notranslate\">prefetch_related()</code><a class=\"heading-anchor\" href=\"#prefetch-related\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.prefetch_related\">\n<span class=\"sig-name descname\">prefetch_related</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>lookups</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.prefetch_related\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Returns a <code class=\"docutils literal notranslate\">QuerySet</code> that will automatically retrieve the given lookups, each\nin one extra batch query. Prefetching is a way to optimize database access\nwhen you know you'll be accessing related objects later, so you can avoid\ntriggering the on-demand loading behavior of the model instances'\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/fetch-modes/\"><span class=\"doc\">fetch mode</span></a>.</p>\n<p>This method has a similar purpose to <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a>, in that both are\ndesigned to eagerly fetch related objects. However, they work in different\nways.</p>\n<p><code class=\"docutils literal notranslate\">select_related</code> 的工作方式是创建一个 SQL 连接，并在 <code class=\"docutils literal notranslate\">SELECT</code> 语句中包含相关对象的字段。出于这个原因，<code class=\"docutils literal notranslate\">select_related</code> 在同一个数据库查询中得到相关对象。然而，为了避免因跨越“many”关系进行连接而产生更大的结果集，<code class=\"docutils literal notranslate\">select_related</code> 仅限于单值关系——外键和一对一。</p>\n<p>另一方面，<code class=\"docutils literal notranslate\">prefetch_related</code> 为每个关系执行单独的查找，并在 Python 中执行“连接”。这使它能够预取许多对多、对一和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\">GenericRelation</code></a> 对象，这是使用 <code class=\"docutils literal notranslate\">select_related</code> 无法完成的，除了外键和一对一关系外，它还支持 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">GenericForeignKey</code></a> 的预取，但是必须在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.prefetch.GenericPrefetch\" title=\"django.contrib.contenttypes.prefetch.GenericPrefetch\"><code class=\"xref py py-class docutils literal notranslate\">GenericPrefetch</code></a> 的 <code class=\"docutils literal notranslate\">querysets</code> 参数中提供每个 <code class=\"docutils literal notranslate\">ContentType</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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Topping</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Pizza</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    toppings <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Topping<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</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>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>name<span class=\"p\">,</span>\n            <span class=\"s2\">&quot;, &quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>topping<span class=\"o\">.</span>name <span class=\"k\">for</span> topping <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>toppings<span class=\"o\">.</span>all<span class=\"p\">()),</span>\n        <span class=\"p\">)</span>\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>Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Pizza: Hawaiian (ham, pineapple)&gt;, &lt;Pizza: Seafood (prawns, smoked salmon)&gt;, ...]&gt;</span>\n</code></pre></div>\n<p>这样做的问题是，每次 <code class=\"docutils literal notranslate\">Pizza.__str__()</code> 要求 <code class=\"docutils literal notranslate\">self.toppings.all()</code> 都要查询数据库，所以 <code class=\"docutils literal notranslate\">Pizza.objects.all()</code> 会在 Toppings 表上对 Pizza <code class=\"docutils literal notranslate\">QuerySet</code> 中的 <em>每</em> 项进行查询。</p>\n<p>我们可以使用 <code class=\"docutils literal notranslate\">prefetch_related</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>Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这意味着每一个 <code class=\"docutils literal notranslate\">Pizza</code> 都有一个 <code class=\"docutils literal notranslate\">self.toppings.all()</code>；现在每次调用 <code class=\"docutils literal notranslate\">self.toppings.all()</code> 时，不必再去数据库中寻找这些项目，而是在一次查询中填充的预设 <code class=\"docutils literal notranslate\">QuerySet</code> 缓存中找到它们。</p>\n<p>That is, all the relevant toppings will have been fetched in a single query,\nand used to make <code class=\"docutils literal notranslate\">QuerySet</code> instances that have a pre-filled cache of the\nrelevant results; these are then used in the <code class=\"docutils literal notranslate\">self.toppings.all()</code> calls.</p>\n<p><code class=\"docutils literal notranslate\">prefetch_related()</code> 中的附加查询是在 <code class=\"docutils literal notranslate\">QuerySet</code> 开始执行和主要查询被执行后执行的。</p>\n<p>请注意，没有机制可以防止另一个数据库查询在主查询和附加查询之间更改项目，这可能会导致不一致的结果。例如，如果在主查询执行后删除了一份 <code class=\"docutils literal notranslate\">Pizza</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>Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;toppings&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">#  &quot;Hawaiian&quot; Pizza was deleted in another shell.</span>\n<span class=\"go\">&lt;QuerySet [&lt;Pizza: Hawaiian ()&gt;, &lt;Pizza: Seafood (prawns, smoked salmon)&gt;]&gt;</span>\n</code></pre></div>\n<p>如果你有一个作为模型实例的可迭代对象，你可以使用 <a class=\"reference internal\" href=\"#django.db.models.prefetch_related_objects\" title=\"django.db.models.prefetch_related_objects\"><code class=\"xref py py-func docutils literal notranslate\">prefetch_related_objects()</code></a> 函数在这些实例上预取相关属性。</p>\n<p>Note that the result cache of the primary <code class=\"docutils literal notranslate\">QuerySet</code> and all specified\nrelated objects will then be fully loaded into memory. This changes the typical\nbehavior of a <code class=\"docutils literal notranslate\">QuerySet</code>, which normally tries to avoid loading all objects\ninto memory before they are needed, even after a query has been executed in the\ndatabase.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Remember that, as always with <code class=\"docutils literal notranslate\">QuerySet</code> objects, any subsequent chained\nmethods which imply a different database query will ignore previously\ncached results, and retrieve data using a fresh database query. So, if you\nwrite the following:</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>pizzas <span class=\"o\">=</span> Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;toppings&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span><span class=\"nb\">list</span><span class=\"p\">(</span>pizza<span class=\"o\">.</span>toppings<span class=\"o\">.</span>filter<span class=\"p\">(</span>spicy<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span> <span class=\"k\">for</span> pizza <span class=\"ow\">in</span> pizzas<span class=\"p\">]</span>\n</code></pre></div>\n<p>...那么 <code class=\"docutils literal notranslate\">pizza.toppings.all()</code> 已经被预取的事实对你没有帮助。<code class=\"docutils literal notranslate\">prefetch_related('toppings')</code> 意味着 <code class=\"docutils literal notranslate\">pizza.toppings.all()</code>，但 <code class=\"docutils literal notranslate\">pizza.toppings.filter()</code> 是一个新的、不同的查询。预设缓存在这里帮不上忙，事实上它损害了性能，因为你做了一个你没有使用过的数据库查询。所以要谨慎使用这个功能！</p>\n<p>Also, if you call the database-altering methods\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.add\" title=\"django.db.models.fields.related.RelatedManager.add\"><code class=\"xref py py-meth docutils literal notranslate\">add()</code></a>,\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.create\" title=\"django.db.models.fields.related.RelatedManager.create\"><code class=\"xref py py-meth docutils literal notranslate\">create()</code></a>,\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.remove\" title=\"django.db.models.fields.related.RelatedManager.remove\"><code class=\"xref py py-meth docutils literal notranslate\">remove()</code></a>,\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.clear\" title=\"django.db.models.fields.related.RelatedManager.clear\"><code class=\"xref py py-meth docutils literal notranslate\">clear()</code></a> or\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.set\" title=\"django.db.models.fields.related.RelatedManager.set\"><code class=\"xref py py-meth docutils literal notranslate\">set()</code></a>, on a\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/relations/#django.db.models.fields.related.RelatedManager\" title=\"django.db.models.fields.related.RelatedManager\"><code class=\"xref py py-class docutils literal notranslate\">RelatedManager</code></a>, any prefetched\ncache for the relation will be cleared.</p>\n</aside>\n<p>你也可以用普通的 join 语法来做相关字段的相关字段。假设我们在上面的例子中多了一个模型：</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\">Restaurant</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    pizzas <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Pizza<span class=\"p\">,</span> related_name<span class=\"o\">=</span><span class=\"s2\">&quot;restaurants&quot;</span><span class=\"p\">)</span>\n    best_pizza <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Pizza<span class=\"p\">,</span> related_name<span class=\"o\">=</span><span class=\"s2\">&quot;championed_by&quot;</span><span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE\n    <span class=\"p\">)</span>\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>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这将为每家餐厅获取最好的比萨饼和最好的比萨饼的所有配料。这将在 3 个数据库查询中完成——一个查询餐厅，一个查询“最佳披萨”，一个查询配料。</p>\n<p><code class=\"docutils literal notranslate\">best_pizza</code> 关系也可以使用 <code class=\"docutils literal notranslate\">select_related</code> 获取，以将查询计数减少到 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>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>由于预取是在主查询之后执行的（其中包括 <code class=\"docutils literal notranslate\">select_related</code> 所需要的连接），它能够检测到 <code class=\"docutils literal notranslate\">best_pizza</code> 对象已经被取走了，它将跳过再次取走它们。</p>\n<p>链式调用 <code class=\"docutils literal notranslate\">prefetch_related</code> 将累积预取的查找。要清除任何 <code class=\"docutils literal notranslate\">prefetch_related</code> 行为，传递 <code class=\"docutils literal notranslate\">None</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>non_prefetched <span class=\"o\">=</span> qs<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在使用 <code class=\"docutils literal notranslate\">prefetch_related</code> 时，需要注意的一个区别是，查询创建的对象可以在与其相关的不同对象之间共享，即一个 Python 模型实例可以出现在返回的对象树的多个点上。这通常会发生在外键关系中。通常情况下，这种行为不会有问题，而且事实上会节省内存和 CPU 时间。</p>\n<p>虽然 <code class=\"docutils literal notranslate\">prefetch_related</code> 支持预取 <code class=\"docutils literal notranslate\">GenericForeignKey</code> 关系，但查询次数将取决于数据。由于一个 <code class=\"docutils literal notranslate\">GenericForeignKey</code> 可以引用多个表中的数据，所以需要对每个被引用的表进行一次查询，而不是对所有项目进行一次查询。如果还没有获取相关的行，可以对 <code class=\"docutils literal notranslate\">ContentType</code> 表进行额外的查询。</p>\n<p><code class=\"docutils literal notranslate\">prefetch_related</code> 在大多数情况下，将使用使用“IN”操作符的 SQL 查询来实现。这意味着对于一个大的 <code class=\"docutils literal notranslate\">QuerySet</code> 可能会生成一个大的“IN”子句，这取决于数据库，在解析或执行 SQL 查询时可能会有自己的性能问题。一定要针对自己的用例进行剖析！</p>\n<p>如果使用 <code class=\"docutils literal notranslate\">iterator()</code> 运行查询，只有在提供了 <code class=\"docutils literal notranslate\">chunk_size</code> 的值时，才会观察到 <code class=\"docutils literal notranslate\">prefetch_related()</code> 调用。</p>\n<p>你可以使用 <a class=\"reference internal\" href=\"#django.db.models.Prefetch\" title=\"django.db.models.Prefetch\"><code class=\"xref py py-class docutils literal notranslate\">Prefetch</code></a> 对象来进一步控制预取操作。</p>\n<p>最简单的形式 <code class=\"docutils literal notranslate\">Prefetch</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> Prefetch\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>你可以用可选的 <code class=\"docutils literal notranslate\">queryset</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>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>Toppings<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Or to call <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> when\napplicable to reduce the number of queries even further:</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>Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;restaurants&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza&quot;</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\">to_attr</code> 参数将预取结果分配给一个自定义属性。结果将直接存储在一个列表中。</p>\n<p>这允许用不同的 <code class=\"docutils literal notranslate\">QuerySet</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>vegetarian_pizzas <span class=\"o\">=</span> Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>vegetarian<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span> to_attr<span class=\"o\">=</span><span class=\"s2\">&quot;menu&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>vegetarian_pizzas<span class=\"p\">,</span> to_attr<span class=\"o\">=</span><span class=\"s2\">&quot;vegetarian_menu&quot;</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\">to_attr</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>vegetarian_pizzas <span class=\"o\">=</span> Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>vegetarian<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>vegetarian_pizzas<span class=\"p\">,</span> to_attr<span class=\"o\">=</span><span class=\"s2\">&quot;vegetarian_menu&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;vegetarian_menu__toppings&quot;</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\">to_attr</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> Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>vegetarian<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Recommended:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>restaurants <span class=\"o\">=</span> Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>queryset<span class=\"p\">,</span> to_attr<span class=\"o\">=</span><span class=\"s2\">&quot;vegetarian_pizzas&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>vegetarian_pizzas <span class=\"o\">=</span> restaurants<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>vegetarian_pizzas\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Not recommended:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>restaurants <span class=\"o\">=</span> Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>queryset<span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>vegetarian_pizzas <span class=\"o\">=</span> restaurants<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>pizzas<span class=\"o\">.</span>all<span class=\"p\">()</span>\n</code></pre></div>\n<p>Custom prefetching also works with single related relations like\nforward <code class=\"docutils literal notranslate\">ForeignKey</code> or <code class=\"docutils literal notranslate\">OneToOneField</code>. Generally you'll want to use\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> for these relations, but there are a number of cases\nwhere prefetching with a custom <code class=\"docutils literal notranslate\">QuerySet</code> is useful:</p>\n<ul>\n<li><p>你要使用一个 <code class=\"docutils literal notranslate\">QuerySet</code>，对相关模型进行进一步的预取。</p></li>\n<li><p>你想只预取相关对象的一个子集。</p></li>\n<li><p>You want to use performance optimization techniques like deferring fields,\nfor example, via <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\">defer()</code></a> or <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\">only()</code></a>:</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> Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>only<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>restaurants <span class=\"o\">=</span> Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>queryset<span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n</ul>\n<p>在使用多个数据库时，<code class=\"docutils literal notranslate\">Prefetch</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\"># Both inner and outer queries will use the &#39;replica&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Inner will use the &#39;replica&#39; database; outer will use &#39;default&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>Toppings<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Inner will use &#39;replica&#39; database; outer will use &#39;cold-storage&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>Toppings<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;cold-storage&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>查询的顺序很重要。</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>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>即使它是无序的，这也是可行的，因为 <code class=\"docutils literal notranslate\">'pizzas__toppings'</code> 已经包含了所有需要的信息，因此第二个参数 <code class=\"docutils literal notranslate\">'pizzas'</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>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">,</span> Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>Pizza<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()))</span>\n</code></pre></div>\n<p>这将引发一个 <code class=\"docutils literal notranslate\">ValueError</code>，因为它试图重新定义一个先前看到的查询的查询集。请注意，一个隐式查询集被创建为遍历 <code class=\"docutils literal notranslate\">''pizzas'</code> 作为 <code class=\"docutils literal notranslate\">''pizzas__toppings'</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>prefetch_related<span class=\"p\">(</span><span class=\"s2\">&quot;pizza_list__toppings&quot;</span><span class=\"p\">,</span> Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span> to_attr<span class=\"o\">=</span><span class=\"s2\">&quot;pizza_list&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>这将触发一个 <code class=\"docutils literal notranslate\">AttributeError</code>，因为 <code class=\"docutils literal notranslate\">'pizza_list'</code> 在处理 <code class=\"docutils literal notranslate\">'pizza_list__toppings'</code> 时还不存在。</p>\n<p>这种考虑不限于使用 <code class=\"docutils literal notranslate\">Prefetch</code> 对象。一些高级技术可能要求按照特定的顺序进行查找，以避免产生额外的查询；因此，建议总是仔细地安排 <code class=\"docutils literal notranslate\">prefetch_related</code> 参数的顺序。</p>\n</aside>\n</section>\n<section id=\"extra\">\n<h4><code class=\"docutils literal notranslate\">extra()</code><a class=\"heading-anchor\" href=\"#extra\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.extra\">\n<span class=\"sig-name descname\">extra</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">select<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">where<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">params<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">tables<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\">select_params<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.extra\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>有时候，Django 查询语法本身并不能很容易地表达一个复杂的 <code class=\"docutils literal notranslate\">WHERE</code> 子句。对于这些边缘情况，Django 提供了 <code class=\"docutils literal notranslate\">extra()</code> <code class=\"docutils literal notranslate\">QuerySet</code> 修饰符——用于将特定的子句注入到由 <code class=\"docutils literal notranslate\">QuerySet</code> 生成的 SQL 中。</p>\n<aside class=\"admonition-use-this-method-as-a-last-resort admonition\" role=\"note\">\n<p class=\"admonition-title\">在万不得已的情况下使用这种方法</p>\n<p>This is an old API that we aim to deprecate at some point in the future.\nUse it only if you cannot express your query using other queryset methods.\nIf you do need to use it, please <a class=\"reference external\" href=\"https://code.djangoproject.com/newticket\">file a ticket</a> using the <a class=\"reference external\" href=\"https://code.djangoproject.com/query?keywords=~QuerySet.extra\">QuerySet.extra\nkeyword</a>\nwith your use case (please check the list of existing tickets first) so\nthat we can enhance the QuerySet API to allow removing <code class=\"docutils literal notranslate\">extra()</code>. We are\nno longer improving or fixing bugs for this method.</p>\n<p>例如，<code class=\"docutils literal notranslate\">extra()</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>extra<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    select<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;val&quot;</span><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>\n<span class=\"gp\">... </span>    select_params<span class=\"o\">=</span><span class=\"p\">(</span>someparam<span class=\"p\">,),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\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>qs<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>someparam<span class=\"p\">,)))</span>\n</code></pre></div>\n<p>使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\">RawSQL</code></a> 的主要好处是，如果需要的话，可以设置 <code class=\"docutils literal notranslate\">output_field</code>。主要的缺点是，如果你在原始 SQL 中引用了查询集的某个表的别名，那么 Django 有可能会改变这个别名（例如，当查询集在另一个查询中被用作子查询时）。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>每当你使用 <code class=\"docutils literal notranslate\">extra()</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=\"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> col <span class=\"k\">FROM</span> sometable <span class=\"k\">WHERE</span> othercol <span class=\"o\">=</span> <span class=\"s1\">&#39;%s&#39;</span>  <span class=\"o\">#</span> unsafe<span class=\"o\">!</span>\n</code></pre></div>\n<p>你可以阅读更多关于 Django 的 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL 注入保护</span></a> 的工作原理。</p>\n</aside>\n<p>根据定义，这些额外的查找可能无法移植到不同的数据库引擎中（因为你明确地编写了 SQL 代码），并且违反了 DRY 原则，所以你应该尽可能地避免它们。</p>\n<p>指定 <code class=\"docutils literal notranslate\">params</code>、<code class=\"docutils literal notranslate\">select</code>、<code class=\"docutils literal notranslate\">where</code> 或 <code class=\"docutils literal notranslate\">tables</code> 中的一个或多个参数。这些参数都不是必须的，但你应该至少使用其中的一个。</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">select</code></p>\n<p>The <code class=\"docutils literal notranslate\">select</code> argument lets you put extra fields in the <code class=\"docutils literal notranslate\">SELECT</code>\nclause. It should be a dictionary mapping attribute names to SQL\nclauses to use to calculate that attribute.</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>select<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;is_recent&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pub_date &gt; &#39;2006-01-01&#39;&quot;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>因此，每个 <code class=\"docutils literal notranslate\">Entry</code> 对象将有一个额外的属性，<code class=\"docutils literal notranslate\">is_recent</code>，一个布尔值，表示该条目的 <code class=\"docutils literal notranslate\">pub_date</code> 是否大于 2006 年 1 月 1 日。</p>\n<p>Django 将给定的 SQL 片段直接插入到 <code class=\"docutils literal notranslate\">SELECT</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> blog_entry<span class=\"p\">.</span><span class=\"o\">*</span><span class=\"p\">,</span> <span class=\"p\">(</span>pub_date <span class=\"o\">&gt;</span> <span class=\"s1\">&#39;2006-01-01&#39;</span><span class=\"p\">)</span> <span class=\"k\">AS</span> is_recent\n<span class=\"k\">FROM</span> blog_entry<span class=\"p\">;</span>\n</code></pre></div>\n<p>下一个例子更高级；它做了一个子查询，给每个结果的 <code class=\"docutils literal notranslate\">Blog</code> 对象一个 <code class=\"docutils literal notranslate\">entry_count</code> 属性，一个相关 <code class=\"docutils literal notranslate\">Entry</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>\n    select<span class=\"o\">=</span><span class=\"p\">{</span>\n        <span class=\"s2\">&quot;entry_count&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id&quot;</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>在这个特殊的情况下，我们利用了这样一个事实，即查询在其 <code class=\"docutils literal notranslate\">FROM</code> 子句中已经包含 <code class=\"docutils literal notranslate\">blog_blog</code> 表。</p>\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=\"k\">SELECT</span> blog_blog<span class=\"p\">.</span><span class=\"o\">*</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"k\">SELECT</span> <span class=\"k\">COUNT</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"p\">)</span> <span class=\"k\">FROM</span> blog_entry <span class=\"k\">WHERE</span> blog_entry<span class=\"p\">.</span>blog_id <span class=\"o\">=</span> blog_blog<span class=\"p\">.</span>id<span class=\"p\">)</span> <span class=\"k\">AS</span> entry_count\n<span class=\"k\">FROM</span> blog_blog<span class=\"p\">;</span>\n</code></pre></div>\n<p>请注意，Django 的 <code class=\"docutils literal notranslate\">select</code> 子句中不需要大多数数据库引擎在子查询周围所需的括号。</p>\n<p>在一些罕见的情况下，你可能希望在 <code class=\"docutils literal notranslate\">extra(select=...)</code> 中给 SQL 片段传递参数。为此，使用 <code class=\"docutils literal notranslate\">select_params</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>\n    select<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">},</span>\n    select_params<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;one&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;two&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你需要在选择字符串中使用 <code class=\"docutils literal notranslate\">%s</code>，请使用序列 <code class=\"docutils literal notranslate\">%%s</code>。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">where</code>／<code class=\"docutils literal notranslate\">tables</code></p>\n<p>你可以通过使用 <code class=\"docutils literal notranslate\">where</code> 来定义明确的 SQL <code class=\"docutils literal notranslate\">WHERE</code> 子句——也许是为了执行非明确的连接。你可以通过使用 <code class=\"docutils literal notranslate\">tables</code> 手动添加表到 SQL <code class=\"docutils literal notranslate\">FROM</code> 子句中。</p>\n<p><code class=\"docutils literal notranslate\">where</code> 和 <code class=\"docutils literal notranslate\">tables</code> 都采用一个字符串列表。所有 <code class=\"docutils literal notranslate\">where</code> 参数都与任何其他搜索标准“AND”在一起。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>where<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;foo=&#39;a&#39; OR bar = &#39;a&#39;&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;baz = &#39;a&#39;&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"o\">*</span> <span class=\"k\">FROM</span> blog_entry <span class=\"k\">WHERE</span> <span class=\"p\">(</span>foo<span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span> <span class=\"k\">OR</span> bar<span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">)</span> <span class=\"k\">AND</span> <span class=\"p\">(</span>baz<span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果使用 <code class=\"docutils literal notranslate\">tables</code> 参数时，要注意指定查询中已经使用过的表，当你通过 <code class=\"docutils literal notranslate\">tables</code> 参数添加额外的表时，Django 会认为你希望额外包含该表，如果已经包含的话。当你通过 <code class=\"docutils literal notranslate\">tables</code> 参数添加额外的表时，Django 会认为你希望额外地包含该表，如果它已经被包含了。这就会产生一个问题，因为表名会被赋予一个别名。如果一个表在一条 SQL 语句中多次出现，那么第二次和后续的表必须使用别名，这样数据库才能区分它们。如果你指的是你在额外的 <code class=\"docutils literal notranslate\">where</code> 参数中添加的额外表，这就会造成错误。</p>\n<p>一般情况下，你只会添加查询中还没有出现的额外表。但是，如果确实出现了上面概述的情况，有几种解决办法。首先，看看是否可以不包含额外的表，而使用已经在查询中出现的表。如果不可能的话，把你的 <code class=\"docutils literal notranslate\">extra()</code> 调用放在查询集构造的前面，这样你的表就是那个表的第一次使用。最后，如果所有其他方法都失败了，看一下产生的查询，重写你的 <code class=\"docutils literal notranslate\">where</code> 加法，使用给你的额外表的别名。每次以同样的方式构造查询集时，别名都会是一样的，所以你可以信赖别名不会改变。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">order_by</code></p>\n<p>If you need to order the resulting queryset using some of the new\nfields or tables you have included via <code class=\"docutils literal notranslate\">extra()</code> use the <code class=\"docutils literal notranslate\">order_by</code>\nparameter to <code class=\"docutils literal notranslate\">extra()</code> and pass in a sequence of strings. These\nstrings should either be model fields (as in the normal\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> method on querysets), of the form\n<code class=\"docutils literal notranslate\">table_name.column_name</code> or an alias for a column that you specified\nin the <code class=\"docutils literal notranslate\">select</code> parameter to <code class=\"docutils literal notranslate\">extra()</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>q <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>select<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;is_recent&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pub_date &gt; &#39;2006-01-01&#39;&quot;</span><span class=\"p\">})</span>\nq <span class=\"o\">=</span> q<span class=\"o\">.</span>extra<span class=\"p\">(</span>order_by<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;-is_recent&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>这将把 <code class=\"docutils literal notranslate\">is_recent</code> 为真的所有项目排在结果集的前面（<code class=\"docutils literal notranslate\">True</code> 按降序排列在 <code class=\"docutils literal notranslate\">False</code> 之前）。</p>\n<p>顺便说一下，这表明你可以多次调用 <code class=\"docutils literal notranslate\">extra()</code>，它将按照你的期望行事（每次增加新的约束）。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">params</code></p>\n<p>上面描述的 <code class=\"docutils literal notranslate\">where</code> 参数可以使用标准的 Python 数据库字符串占位符——<code class=\"docutils literal notranslate\">'%s'</code> 来表示数据库引擎应该自动引用的参数。<code class=\"docutils literal notranslate\">params</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>where<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">],</span> params<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>始终使用 <code class=\"docutils literal notranslate\">params</code> 而不是直接将值嵌入 <code class=\"docutils literal notranslate\">where</code>，因为 <code class=\"docutils literal notranslate\">params</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>where<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline=&#39;Lennon&#39;&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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>extra<span class=\"p\">(</span>where<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">],</span> params<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n</li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>如果你在 MySQL 上执行查询，请注意 MySQL 的静默强制类型转换可能会在混合类型时导致意外的结果。如果你在一个字符串类型的列上查询，但却有一个整数值，MySQL 会在执行比较之前将表中所有值的类型强制转换为整数。例如，如果你的表中包含值 <code class=\"docutils literal notranslate\">'abc'</code>、<code class=\"docutils literal notranslate\">'def'</code>，而你查询 <code class=\"docutils literal notranslate\">WHERE mycolumn=0</code>，这两行都会匹配。为了防止这种情况发生，在查询中使用该值之前，请执行正确的类型转换。</p>\n</aside>\n</section>\n<section id=\"defer\">\n<h4><code class=\"docutils literal notranslate\">defer()</code><a class=\"heading-anchor\" href=\"#defer\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.defer\">\n<span class=\"sig-name descname\">defer</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.defer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在一些复杂的数据建模情况下，你的模型可能包含很多字段，其中一些字段可能包含很多数据（例如，文本字段），或者需要昂贵的处理来将它们转换为 Python 对象。如果你在某些情况下使用查询集的结果，在最初获取数据时不知道是否需要这些特定的字段，你可以告诉 Django 不要从数据库中检索这些字段。</p>\n<p>通过将不加载的字段名称传递给 <code class=\"docutils literal notranslate\">defer()</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>一个有递延字段的查询集仍然会返回模型实例。如果你访问每个递延字段，将从数据库中检索该字段（一次一个，而不是同时访问所有的递延字段）。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>延迟加载的字段不会像这样从异步代码中惰性加载。相反，你将得到一个 <code class=\"docutils literal notranslate\">SynchronousOnlyOperation</code> 异常。如果你正在编写异步代码，不应尝试访问任何你已经使用 <code class=\"docutils literal notranslate\">defer()</code> 推迟加载的字段。</p>\n</aside>\n<p>你可以多次调用 <code class=\"docutils literal notranslate\">defer()</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=\"c1\"># Defers both the body and headline fields.</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>rating<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span><span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>字段被添加到递延集的顺序并不重要。用已经被递延的字段名调用 <code class=\"docutils literal notranslate\">defer()</code> 是无害的（该字段仍将被递延）。</p>\n<p>You can defer loading of fields in related models (if the related models are\nloading via <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a>) by using the standard double-underscore\nnotation to separate related fields:</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">()</span><span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;entry__headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;entry__body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你想清除一组递延字段，将 <code class=\"docutils literal notranslate\">None</code> 作为参数传递给 <code class=\"docutils literal notranslate\">defer()</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=\"c1\"># Load all fields immediately.</span>\nmy_queryset<span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Some fields in a model won't be deferred, even if you ask for them. You can\nnever defer the loading of the primary key. If you are using\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> to retrieve related models, you shouldn't defer the\nloading of the field that connects from the primary model to the related\none, doing so will result in an error.</p>\n<p>Similarly, calling <code class=\"docutils literal notranslate\">defer()</code> (or its counterpart <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\">only()</code></a>) including an\nargument from an aggregation (e.g. using the result of <a class=\"reference internal\" href=\"#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>)\ndoesn't make sense: doing so will raise an exception. The aggregated values\nwill always be fetched into the resulting queryset.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>The <code class=\"docutils literal notranslate\">defer()</code> method (and its cousin, <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\">only()</code></a>, below) are only for\nadvanced use-cases. They provide an optimization for when you have analyzed\nyour queries closely and understand <em>exactly</em> what information you need and\nhave measured that the difference between returning the fields you need and\nthe full set of fields for the model will be significant.</p>\n<p>Even if you think you are in the advanced use-case situation, <strong>only use</strong>\n<code class=\"docutils literal notranslate\">defer()</code> <strong>when you cannot, at queryset load time, determine if you will\nneed the extra fields or not</strong>. If you are frequently loading and using a\nparticular subset of your data, the best choice you can make is to\nnormalize your models and put the non-loaded data into a separate model\n(and database table). If the columns <em>must</em> stay in the one table for some\nreason, create a model with <code class=\"docutils literal notranslate\">Meta.managed = False</code> (see the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.managed\" title=\"django.db.models.Options.managed\"><code class=\"xref py py-attr docutils literal notranslate\">managed</code></a> documentation) containing just\nthe fields you normally need to load and use that where you might otherwise\ncall <code class=\"docutils literal notranslate\">defer()</code>. This makes your code more explicit to the reader, is\nslightly faster and consumes a little less memory in the Python process.</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\">CommonlyUsedModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    f1 <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        managed <span class=\"o\">=</span> <span class=\"kc\">False</span>\n        db_table <span class=\"o\">=</span> <span class=\"s2\">&quot;app_largetable&quot;</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ManagedModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    f1 <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n    f2 <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        db_table <span class=\"o\">=</span> <span class=\"s2\">&quot;app_largetable&quot;</span>\n\n\n<span class=\"c1\"># Two equivalent QuerySets:</span>\nCommonlyUsedModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\nManagedModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;f2&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果很多字段需要在非托管模型中重复，最好的办法是创建一个共享字段的抽象模型，然后让非托管模型和托管模型从抽象模型中继承。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>When calling <a class=\"reference internal\" href=\"/zh-hans/6.1/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> for instances with\ndeferred fields, only the loaded fields will be saved. See\n<a class=\"reference internal\" href=\"/zh-hans/6.1/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> for more details.</p>\n</aside>\n</section>\n<section id=\"only\">\n<h4><code class=\"docutils literal notranslate\">only()</code><a class=\"heading-anchor\" href=\"#only\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.only\">\n<span class=\"sig-name descname\">only</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.only\"><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\">only()</code> 方法实际上是 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\">defer()</code></a> 的相反。只有传递到此方法中的字段，并且尚未指定为延迟加载的字段，在查询集评估时会立即加载。</p>\n<p>如果你有一个几乎所有字段都需要延迟加载的模型，使用 <code class=\"docutils literal notranslate\">only()</code> 来指定补充的字段集合可以简化代码。</p>\n<p>假设你有一个模型，其字段为 <code class=\"docutils literal notranslate\">name</code>、<code class=\"docutils literal notranslate\">age</code> 和 <code class=\"docutils literal notranslate\">biography</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>Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;age&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;biography&quot;</span><span class=\"p\">)</span>\nPerson<span class=\"o\">.</span>objects<span class=\"o\">.</span>only<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>每当你调用 <code class=\"docutils literal notranslate\">only()</code> 时，它就会 <em>替换</em> 要立即加载的字段集。该方法的名称是记号式的：<strong>仅</strong> 那些字段被立即加载；其余的字段被推迟。因此，连续调用 <code class=\"docutils literal notranslate\">only()</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=\"c1\"># This will defer all fields except the headline.</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>only<span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>only<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>由于 <code class=\"docutils literal notranslate\">defer()</code> 以递增的方式行事（将字段添加到递延列表中），你可以将对 <code class=\"docutils literal notranslate\">only()</code> 和 <code class=\"docutils literal notranslate\">defer()</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=\"c1\"># Final result is that everything except &quot;headline&quot; is deferred.</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>only<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Final result loads headline immediately.</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>defer<span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>only<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\">defer()</code></a> 文档注释中的所有注意事项也适用于 <code class=\"docutils literal notranslate\">only()</code>。谨慎使用，只有在用尽其他选项后才能使用。</p>\n<p>使用 <code class=\"docutils literal notranslate\">only()</code> 并省略使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> 请求的字段也是错误的。另一方面，如果在没有任何参数的情况下调用 <code class=\"docutils literal notranslate\">only()</code>，将返回查询集提取的每个字段（包括注释）。</p>\n<p>与 <code class=\"docutils literal notranslate\">defer()</code> 一样，你不能从异步代码中访问未加载的字段并期望它们加载。相反，你将得到一个 <code class=\"docutils literal notranslate\">SynchronousOnlyOperation</code> 异常。确保你可能访问的所有字段都在你的 <code class=\"docutils literal notranslate\">only()</code> 调用中。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>When calling <a class=\"reference internal\" href=\"/zh-hans/6.1/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> for instances with\ndeferred fields, only the loaded fields will be saved. See\n<a class=\"reference internal\" href=\"/zh-hans/6.1/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> for more details.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>在在 <code class=\"docutils literal notranslate\">only()</code> 之后使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\">defer()</code></a> 时，<code class=\"docutils literal notranslate\">defer</code> 中的字段将覆盖在两者中都列出的字段的 <code class=\"docutils literal notranslate\">only()</code>。</p>\n</aside>\n</section>\n<section id=\"using\">\n<h4><code class=\"docutils literal notranslate\">using()</code><a class=\"heading-anchor\" href=\"#using\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.using\">\n<span class=\"sig-name descname\">using</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">alias</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.using\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>This method is for controlling which database the <code class=\"docutils literal notranslate\">QuerySet</code> will be\nevaluated against if you are using more than one database. The only argument\nthis method takes is the alias of a database, as defined in\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></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=\"go\"># queries the database with the &#39;default&#39; alias.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n\n<span class=\"go\"># queries the database with the &#39;backup&#39; alias</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;backup&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"select-for-update\">\n<h4><code class=\"docutils literal notranslate\">select_for_update()</code><a class=\"heading-anchor\" href=\"#select-for-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.select_for_update\">\n<span class=\"sig-name descname\">select_for_update</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">nowait<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">skip_locked<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">of<span class=\"o\">=</span><span class=\"default_value\">()</span></em>, <em class=\"sig-param\">no_key<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.select_for_update\"><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\">SELECT ... FOR UPDATE</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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> transaction\n\nentries <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_for_update<span class=\"p\">()</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>author<span class=\"o\">=</span>request<span class=\"o\">.</span>user<span class=\"p\">)</span>\n<span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>\n    <span class=\"k\">for</span> entry <span class=\"ow\">in</span> entries<span class=\"p\">:</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>当查询集被执行时（这里是 <code class=\"docutils literal notranslate\">for entry in entries</code>），所有匹配的条目将被锁定，直到事务块结束，这意味着其他事务将被阻止改变或获取它们的锁。</p>\n<p>通常情况下，如果另一个事务已经获得了所选行的锁，那么查询将被阻塞，直到锁被释放。如果这不是你想要的行为，调用 <code class=\"docutils literal notranslate\">select_for_update(nowait=True)</code>。这将使调用非阻塞。如果一个冲突的锁已经被另一个事务获取，那么当查询集被评估时，将引发 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.db.DatabaseError\" title=\"django.db.DatabaseError\"><code class=\"xref py py-exc docutils literal notranslate\">DatabaseError</code></a>。你也可以通过使用 <code class=\"docutils literal notranslate\">select_for_update( skip_locked=True)</code> 来忽略锁定的记录。<code class=\"docutils literal notranslate\">nowait</code> 和 <code class=\"docutils literal notranslate\">skip_locked</code> 是相互排斥的，在启用这两个选项的情况下调用 <code class=\"docutils literal notranslate\">select_for_update()</code> 会导致一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">ValueError</code></a>。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">select_for_update()</code> 锁定所有被查询选择的行。例如，在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> 中指定的相关对象的行，除了查询集模型的行之外，也会被锁定。如果不希望这样，可以在 <code class=\"docutils literal notranslate\">select_for_update(of=(...))</code> 中使用与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> 相同的字段语法指定你要锁定的相关对象。使用 <code class=\"docutils literal notranslate\">'self'</code> 来表示查询集的模型。</p>\n<aside class=\"admonition-lock-parents-models-in-select-for-update-of admonition\" role=\"note\">\n<p class=\"admonition-title\">在 <code class=\"docutils literal notranslate\">select_for_update(of=(...))</code> 中锁定父模型</p>\n<p>如果在使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">多表继承</span></a> 时要锁定父模型，必须在 <code class=\"docutils literal notranslate\">of</code> 参数中指定父链接字段（默认为 <code class=\"docutils literal notranslate\">&lt;parent_model_name&gt;_ptr</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>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_for_update<span class=\"p\">(</span>of<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;self&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;place_ptr&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition-using-select-for-update-of-with-specified-fields admonition\" role=\"note\">\n<p class=\"admonition-title\">在指定的字段使用 <code class=\"docutils literal notranslate\">select_for_update(of=(...))</code></p>\n<p>如果你想锁定模型并指定选定的字段，例如使用 <a class=\"reference internal\" href=\"#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>，你必须从每个模型的 <code class=\"docutils literal notranslate\">of</code> 参数中至少选择一个字段。没有选定字段的模型将不会被锁定。</p>\n</aside>\n<p>仅在 PostgreSQL 上，你可以通过 <code class=\"docutils literal notranslate\">no_key=True</code> 来获得一个较弱的锁，这仍然允许在锁存在的情况下，创建仅仅引用锁定的行（例如，通过外键）。PostgreSQL 文档中有更多关于 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-ROWS\">行级锁模式的细节</a> 。</p>\n<p>你不能在可空关联上使用 <code class=\"docutils literal notranslate\">select_for_update()</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>Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;hometown&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>select_for_update<span class=\"p\">()</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">django.db.utils.NotSupportedError</span>: FOR UPDATE cannot be applied to the nullable side of an outer join\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>Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>select_related<span class=\"p\">(</span><span class=\"s2\">&quot;hometown&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>select_for_update<span class=\"p\">()</span><span class=\"o\">.</span>exclude<span class=\"p\">(</span>hometown<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Person: ...&gt;, ...]&gt;</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\">postgresql</code>, <code class=\"docutils literal notranslate\">oracle</code>, and <code class=\"docutils literal notranslate\">mysql</code> database backends support\n<code class=\"docutils literal notranslate\">select_for_update()</code>. However, MariaDB only supports the <code class=\"docutils literal notranslate\">nowait</code> and\n<code class=\"docutils literal notranslate\">skip_locked</code> arguments, and MySQL supports the <code class=\"docutils literal notranslate\">nowait</code>, <code class=\"docutils literal notranslate\">skip_locked</code>,\nand <code class=\"docutils literal notranslate\">of</code> arguments. The <code class=\"docutils literal notranslate\">no_key</code> argument is only supported on PostgreSQL.</p>\n<p>在使用不支持这些选项的数据库后端（如 MySQL）向 <code class=\"docutils literal notranslate\">select_for_update()``传递 ``nowait=True</code>、<code class=\"docutils literal notranslate\">skip_locked=True</code>、<code class=\"docutils literal notranslate\">no_key=True</code> 或 <code class=\"docutils literal notranslate\">of</code>，会产生一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.db.NotSupportedError\" title=\"django.db.NotSupportedError\"><code class=\"xref py py-exc docutils literal notranslate\">NotSupportedError</code></a>。这可以防止代码意外地阻塞。</p>\n<p>在支持 <code class=\"docutils literal notranslate\">SELECT ... FOR UPDATE</code> 的后端上，用 <code class=\"docutils literal notranslate\">select_for_update()</code> 在自动提交模式下执行一个查询集是一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.db.transaction.TransactionManagementError\" title=\"django.db.transaction.TransactionManagementError\"><code class=\"xref py py-exc docutils literal notranslate\">TransactionManagementError</code></a> 错误，因为在这种情况下行没有被锁定。如果允许这样做，这将促进数据损坏，并且很容易通过调用期望在一个事务之外的事务中运行的代码而引起。</p>\n<p>在不支持 <code class=\"docutils literal notranslate\">SELECT ... FOR UPDATE</code> 的后端（比如 SQLite）使用 <code class=\"docutils literal notranslate\">select_for_update()</code> 不会有任何影响。<code class=\"docutils literal notranslate\">SELECT ... FOR UPDATE</code> 不会被添加到查询中，如果 <code class=\"docutils literal notranslate\">select_for_update()</code> 在自动提交模式下使用，也不会出现错误。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>Although <code class=\"docutils literal notranslate\">select_for_update()</code> normally fails in autocommit mode, since\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">TestCase</code></a> automatically wraps each test in a\ntransaction, calling <code class=\"docutils literal notranslate\">select_for_update()</code> in a <code class=\"docutils literal notranslate\">TestCase</code> even outside\nan <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> block will (perhaps unexpectedly)\npass without raising a <code class=\"docutils literal notranslate\">TransactionManagementError</code>. To properly test\n<code class=\"docutils literal notranslate\">select_for_update()</code> you should use\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\">TransactionTestCase</code></a>.</p>\n</aside>\n<aside class=\"admonition-certain-expressions-may-not-be-supported admonition\" role=\"note\">\n<p class=\"admonition-title\">可能不支持某些表达方式</p>\n<p>PostgreSQL 不支持 <code class=\"docutils literal notranslate\">select_for_update()</code> 与 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\">Window</code></a> 表达式。</p>\n</aside>\n</section>\n<section id=\"raw\">\n<h4><code class=\"docutils literal notranslate\">raw()</code><a class=\"heading-anchor\" href=\"#raw\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.raw\">\n<span class=\"sig-name descname\">raw</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">raw_query</em>, <em class=\"sig-param\">params<span class=\"o\">=</span><span class=\"default_value\">()</span></em>, <em class=\"sig-param\">translations<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.raw\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>获取一个原始 SQL 查询，执行它，并返回一个 <code class=\"docutils literal notranslate\">django.db.models.query.RawQuerySet</code> 实例。这个 <code class=\"docutils literal notranslate\">RawQuerySet</code> 实例可以像普通的 <code class=\"docutils literal notranslate\">QuerySet</code> 一样进行迭代，提供对象实例。</p>\n<p>更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/sql/\"><span class=\"doc\">执行原生 SQL 查询</span></a>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p><code class=\"docutils literal notranslate\">raw()</code> 总是触发一个新的查询，并且不考虑以前的过滤。因此，它通常应该从 <code class=\"docutils literal notranslate\">Manager</code> 或从一个新的 <code class=\"docutils literal notranslate\">QuerySet</code> 实例中调用。</p>\n</aside>\n</section>\n</section>\n<section id=\"operators-that-return-new-querysets\">\n<h3>返回新 <code class=\"docutils literal notranslate\">QuerySet</code> 的操作符<a class=\"heading-anchor\" href=\"#operators-that-return-new-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>组合的查询集必须使用相同的模型。</p>\n<section id=\"and\">\n<h4>AND（<code class=\"docutils literal notranslate\">&amp;</code>）<a class=\"heading-anchor\" href=\"#and\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\">AND</code> 运算符以类似于链接过滤器的方式合并两个 <code class=\"docutils literal notranslate\">QuerySet</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>Model<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>x<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> Model<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>y<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\nModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>x<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>y<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> x<span class=\"o\">=</span><span class=\"mi\">1</span> <span class=\"k\">AND</span> y<span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n</section>\n<section id=\"or\">\n<h4>OR（<code class=\"docutils literal notranslate\">|</code>）<a class=\"heading-anchor\" href=\"#or\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>使用 SQL <code class=\"docutils literal notranslate\">OR</code> 操作符将两个 <code class=\"docutils literal notranslate\">QuerySet</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>Model<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>x<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">|</span> Model<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>y<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Q\n\nModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>Q<span class=\"p\">(</span>x<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>y<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> x<span class=\"o\">=</span><span class=\"mi\">1</span> <span class=\"k\">OR</span> y<span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">|</code> 不是一个换元运算，因为可能会产生不同的（虽然是等价的）查询。</p>\n</section>\n<section id=\"xor\">\n<h4>XOR (<code class=\"docutils literal notranslate\">^</code>)<a class=\"heading-anchor\" href=\"#xor\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\">XOR</code> 运算符合并两个 <code class=\"docutils literal notranslate\">QuerySet</code>。<code class=\"docutils literal notranslate\">XOR</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>Model<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>x<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">^</span> Model<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>y<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Q\n\nModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>Q<span class=\"p\">(</span>x<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">^</span> Q<span class=\"p\">(</span>y<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> x<span class=\"o\">=</span><span class=\"mi\">1</span> XOR y<span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\">XOR</code> 在 MariaDB 和 MySQL 上受到原生支持。在其他数据库上，<code class=\"docutils literal notranslate\">x ^ y ^ ... ^ z</code> 会被转换为等效的形式：</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=\"p\">(</span>x <span class=\"k\">OR</span> y <span class=\"k\">OR</span> <span class=\"p\">...</span> <span class=\"k\">OR</span> z<span class=\"p\">)</span> <span class=\"k\">AND</span>\n<span class=\"mi\">1</span><span class=\"o\">=</span><span class=\"k\">MOD</span><span class=\"p\">(</span>\n    <span class=\"p\">(</span><span class=\"k\">CASE</span> <span class=\"k\">WHEN</span> x <span class=\"k\">THEN</span> <span class=\"mi\">1</span> <span class=\"k\">ELSE</span> <span class=\"mi\">0</span> <span class=\"k\">END</span><span class=\"p\">)</span> <span class=\"o\">+</span>\n    <span class=\"p\">(</span><span class=\"k\">CASE</span> <span class=\"k\">WHEN</span> y <span class=\"k\">THEN</span> <span class=\"mi\">1</span> <span class=\"k\">ELSE</span> <span class=\"mi\">0</span> <span class=\"k\">END</span><span class=\"p\">)</span> <span class=\"o\">+</span>\n    <span class=\"p\">...</span>\n    <span class=\"p\">(</span><span class=\"k\">CASE</span> <span class=\"k\">WHEN</span> z <span class=\"k\">THEN</span> <span class=\"mi\">1</span> <span class=\"k\">ELSE</span> <span class=\"mi\">0</span> <span class=\"k\">END</span><span class=\"p\">),</span>\n    <span class=\"mi\">2</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n</section>\n<section id=\"methods-that-do-not-return-querysets\">\n<h3>不返回 <code class=\"docutils literal notranslate\">QuerySet</code> 的方法<a class=\"heading-anchor\" href=\"#methods-that-do-not-return-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>以下 <code class=\"docutils literal notranslate\">QuerySet</code> 方法执行 <code class=\"docutils literal notranslate\">QuerySet</code>，并返回 <code class=\"docutils literal notranslate\">QuerySet</code> 以外的东西。</p>\n<p>这些方法不使用缓存（参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#caching-and-querysets\"><span class=\"std std-ref\">缓存和 QuerySet</span></a>）。相反，它们每次被调用时都会查询数据库。</p>\n<p>因为这些方法评估了 QuerySet，它们是阻塞调用，因此它们的主要（同步）版本不能从异步代码中调用。因此，每个方法都有一个带有 <code class=\"docutils literal notranslate\">a</code> 前缀的相应异步版本 - 例如，你可以使用 <code class=\"docutils literal notranslate\">await aget(…)</code> 而不是 <code class=\"docutils literal notranslate\">get(…)</code>。</p>\n<p>通常，除了它们的异步性质之外，它们的行为没有太大区别，但任何差异都在下面的方法旁边进行了说明。</p>\n<section id=\"get\">\n<h4><code class=\"docutils literal notranslate\">get()</code><a class=\"heading-anchor\" href=\"#get\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.get\">\n<span class=\"sig-name descname\">get</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.get\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aget\">\n<span class=\"sig-name descname\">aget</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aget()</code></p>\n<p>返回与给定的查找参数相匹配的对象，其格式应该在 <a class=\"reference internal\" href=\"#id4\">Field lookups</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>Q<span class=\"p\">(</span>blog<span class=\"o\">=</span>blog<span class=\"p\">)</span> <span class=\"o\">&amp;</span> Q<span class=\"p\">(</span>entry_number<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>如果你希望一个查询集已经返回一条记录，你可以在没有任何参数的情况下使用 <code class=\"docutils literal notranslate\">get()</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">()</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\">get()</code> 没有找到任何对象，它会引发一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">Model.DoesNotExist</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=-</span><span class=\"mi\">999</span><span class=\"p\">)</span>  <span class=\"c1\"># raises Entry.DoesNotExist</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\">get()</code> 发现多个对象，会引发一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/class/#django.db.models.Model.MultipleObjectsReturned\" title=\"django.db.models.Model.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\">Model.MultipleObjectsReturned</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;A Duplicated Name&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># raises Entry.MultipleObjectsReturned</span>\n</code></pre></div>\n<p>这两个异常类都是模型类的属性，并且特定于该模型。如果你想对不同模型的多个 <code class=\"docutils literal notranslate\">get()</code> 调用处理这样的异常，可以使用它们的通用基类。例如，你可以使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">django.core.exceptions.ObjectDoesNotExist</code></a> 来处理 <code class=\"xref py py-exc docutils literal notranslate\">DoesNotExist</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.core.exceptions</span> <span class=\"kn\">import</span> ObjectDoesNotExist\n\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    blog <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    entry <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>blog<span class=\"o\">=</span>blog<span class=\"p\">,</span> entry_number<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> ObjectDoesNotExist<span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Either the blog or entry doesn&#39;t exist.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"create\">\n<h4><code class=\"docutils literal notranslate\">create()</code><a class=\"heading-anchor\" href=\"#create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.create\">\n<span class=\"sig-name descname\">create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.create\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.acreate\">\n<span class=\"sig-name descname\">acreate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.acreate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">acreate()</code></p>\n<p>A convenience method for creating an object and saving it all in one step.\nThus:</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>p <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;Bruce&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Springsteen&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>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;Bruce&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Springsteen&quot;</span><span class=\"p\">)</span>\np<span class=\"o\">.</span>save<span class=\"p\">(</span>force_insert<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>是等效的。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">force_insert</span></a> 参数在其他地方有说明，但它的意思是总是会创建一个新的对象。通常情况下，你不需要担心这个问题。但是，如果你的模型中包含了一个你设置的手动主键值，而且如果这个值已经存在于数据库中，那么对 <code class=\"docutils literal notranslate\">create()</code> 的调用就会以一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\">IntegrityError</code></a> 失败，因为主键必须是唯一的。如果使用手动主键，要做好处理异常的准备。</p>\n</section>\n<section id=\"get-or-create\">\n<h4><code class=\"docutils literal notranslate\">get_or_create()</code><a class=\"heading-anchor\" href=\"#get-or-create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.get_or_create\">\n<span class=\"sig-name descname\">get_or_create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">defaults<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.get_or_create\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aget_or_create\">\n<span class=\"sig-name descname\">aget_or_create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">defaults<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aget_or_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aget_or_create()</code></p>\n<p>一个方便的方法，用于查找具有给定 <code class=\"docutils literal notranslate\">kwargs</code> 的对象（如果你的模型对所有字段都有默认值，则可能为空），必要时创建一个对象。</p>\n<p>返回 <code class=\"docutils literal notranslate\">(object, created)</code> 的元组，其中 <code class=\"docutils literal notranslate\">object</code> 是检索或创建的对象，<code class=\"docutils literal notranslate\">created</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\">try</span><span class=\"p\">:</span>\n    obj <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> Person<span class=\"o\">.</span>DoesNotExist<span class=\"p\">:</span>\n    obj <span class=\"o\">=</span> Person<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">,</span> birthday<span class=\"o\">=</span>date<span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">))</span>\n    obj<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>在这里，如果是并发请求，可能会多次尝试用相同的参数保存一个 <code class=\"docutils literal notranslate\">Person</code>。为了避免这种竞争条件，可以使用 <code class=\"docutils literal notranslate\">get_or_create()</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>obj<span class=\"p\">,</span> created <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>get_or_create<span class=\"p\">(</span>\n    first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span>\n    last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">,</span>\n    defaults<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;birthday&quot;</span><span class=\"p\">:</span> date<span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">)},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Any keyword arguments passed to <code class=\"docutils literal notranslate\">get_or_create()</code> — <em>except</em> an optional one\ncalled <code class=\"docutils literal notranslate\">defaults</code> — will be used in a <a class=\"reference internal\" href=\"#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> call. If an object is\nfound, <code class=\"docutils literal notranslate\">get_or_create()</code> returns a tuple of that object and <code class=\"docutils literal notranslate\">False</code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>假设数据库强制执行关键字参数的唯一性（参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\">unique</code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\">unique_together</code></a>），这个方法是原子性的。如果关键字参数中使用的字段没有唯一性约束，那么对该方法的并发调用可能会导致插入具有相同参数的多条记录。</p>\n</aside>\n<p>You can specify more complex conditions for the retrieved object by chaining\n<code class=\"docutils literal notranslate\">get_or_create()</code> with <code class=\"docutils literal notranslate\">filter()</code> and using <a class=\"reference internal\" href=\"#q-objects\"><span class=\"std std-ref\">Q() 对象</span></a>. For example,\nto retrieve Robert or Bob Marley if either exists, and create the latter\notherwise:</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> Q\n\nobj<span class=\"p\">,</span> created <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n    Q<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;Robert&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span><span class=\"o\">.</span>get_or_create<span class=\"p\">(</span>last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Marley&quot;</span><span class=\"p\">,</span> defaults<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>如果找到多个对象，<code class=\"docutils literal notranslate\">get_or_create()</code> 会引发 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.MultipleObjectsReturned\" title=\"django.core.exceptions.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\">MultipleObjectsReturned</code></a>。如果没有找到对象，<code class=\"docutils literal notranslate\">get_or_create()</code> 将实例化并保存一个新对象，返回一个新对象的元组和 <code class=\"docutils literal notranslate\">True</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>params <span class=\"o\">=</span> <span class=\"p\">{</span>k<span class=\"p\">:</span> v <span class=\"k\">for</span> k<span class=\"p\">,</span> v <span class=\"ow\">in</span> kwargs<span class=\"o\">.</span>items<span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"s2\">&quot;__&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> k<span class=\"p\">}</span>\nparams<span class=\"o\">.</span>update<span class=\"p\">({</span>k<span class=\"p\">:</span> v<span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"nb\">callable</span><span class=\"p\">(</span>v<span class=\"p\">)</span> <span class=\"k\">else</span> v <span class=\"k\">for</span> k<span class=\"p\">,</span> v <span class=\"ow\">in</span> defaults<span class=\"o\">.</span>items<span class=\"p\">()})</span>\nobj <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>model<span class=\"p\">(</span><span class=\"o\">**</span>params<span class=\"p\">)</span>\nobj<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>在英语中，这意味着从任何不包含双下划线的非 <code class=\"docutils literal notranslate\">'defaults'</code> 关键字参数开始（这将表明一个非精确的查找）。然后添加 <code class=\"docutils literal notranslate\">defaults</code> 的内容，必要时覆盖任何键，并将结果作为模型类的关键字参数。如果 <code class=\"docutils literal notranslate\">defaults</code> 中存在任何可调用对象，则对其进行评估。正如上面所提示的，这是对所使用算法的简化，但它包含了所有相关的细节。内部实现有比这更多的错误检查，并处理一些额外的边缘条件；如果你感兴趣，请阅读代码。</p>\n<p>如果你有一个名为 <code class=\"docutils literal notranslate\">defaults</code> 的字段，并且想在 <code class=\"docutils literal notranslate\">get_or_create()</code> 中使用它作为精确查询，使用 <code class=\"docutils literal notranslate\">'defaults__exact'</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>Foo<span class=\"o\">.</span>objects<span class=\"o\">.</span>get_or_create<span class=\"p\">(</span>defaults__exact<span class=\"o\">=</span><span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">,</span> defaults<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;defaults&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;baz&quot;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\">get_or_create()</code> method has similar error behavior to <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.create\" title=\"django.db.models.query.QuerySet.create\"><code class=\"xref py py-meth docutils literal notranslate\">create()</code></a>\nwhen you're using manually specified primary keys. If an object needs to be\ncreated and the key already exists in the database, an\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\">IntegrityError</code></a> will be raised.</p>\n<p>最后，关于在 Django 视图中使用 <code class=\"docutils literal notranslate\">get_or_create()</code> 的一些建议。请确保只在 <code class=\"docutils literal notranslate\">POST</code> 请求中使用它，除非你有充分的理由不这样做。<code class=\"docutils literal notranslate\">GET</code> 请求不应该对数据产生任何影响。相反，只有当对页面的请求对数据产生副作用时，才使用 <code class=\"docutils literal notranslate\">POST</code>。有关更多信息，请参阅 HTTP 规范中的 <span class=\"target\" id=\"index-4\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.2.1\"><strong>Safe methods</strong></a>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>你可以通过 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> 属性和反向关系来使用 <code class=\"docutils literal notranslate\">get_or_create()</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\">class</span> <span class=\"nc\">Chapter</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">,</span> unique<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">256</span><span class=\"p\">)</span>\n    chapters <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Chapter<span class=\"p\">)</span>\n</code></pre></div>\n<p>你可以通过 Book 的 chapters 字段使用 <code class=\"docutils literal notranslate\">get_or_create()</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> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Ulysses&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>book<span class=\"o\">.</span>chapters<span class=\"o\">.</span>get_or_create<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Telemachus&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;Chapter: Telemachus&gt;, True)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>book<span class=\"o\">.</span>chapters<span class=\"o\">.</span>get_or_create<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Telemachus&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;Chapter: Telemachus&gt;, False)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Chapter<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Chapter 1&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Chapter: Chapter 1&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>book<span class=\"o\">.</span>chapters<span class=\"o\">.</span>get_or_create<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Chapter 1&quot;</span><span class=\"p\">)</span>\n<span class=\"go\"># Raises IntegrityError</span>\n</code></pre></div>\n<p>This is happening because it's trying to get or create &quot;Chapter 1&quot; through\nthe book &quot;Ulysses&quot;, but it can't do either: the relation can't fetch that\nchapter because it isn't related to that book, but it can't create it either\nbecause <code class=\"docutils literal notranslate\">title</code> field should be unique.</p>\n</aside>\n</section>\n<section id=\"update-or-create\">\n<h4><code class=\"docutils literal notranslate\">update_or_create()</code><a class=\"heading-anchor\" href=\"#update-or-create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.update_or_create\">\n<span class=\"sig-name descname\">update_or_create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">defaults<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">create_defaults<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.update_or_create\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aupdate_or_create\">\n<span class=\"sig-name descname\">aupdate_or_create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">defaults<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">create_defaults<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aupdate_or_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aupdate_or_create()</code></p>\n<p>一个方便的方法，用于使用给定的 <code class=\"docutils literal notranslate\">kwargs</code> 更新对象，如果需要的话创建一个新对象。<code class=\"docutils literal notranslate\">create_defaults</code> 和 <code class=\"docutils literal notranslate\">defaults</code> 都是 (字段, 值) 对的字典。<code class=\"docutils literal notranslate\">create_defaults</code> 和 <code class=\"docutils literal notranslate\">defaults</code> 中的值可以是可调用的。<code class=\"docutils literal notranslate\">defaults</code> 用于更新对象，而 <code class=\"docutils literal notranslate\">create_defaults</code> 用于创建操作。如果未提供 <code class=\"docutils literal notranslate\">create_defaults</code>，则将使用 <code class=\"docutils literal notranslate\">defaults</code> 进行创建操作。</p>\n<p>返回 <code class=\"docutils literal notranslate\">(object, created)</code> 的元组，其中 <code class=\"docutils literal notranslate\">object</code> 是创建或更新的对象，<code class=\"docutils literal notranslate\">created</code> 是一个布尔值，指定是否创建了一个新对象。</p>\n<p><code class=\"docutils literal notranslate\">update_or_create</code> 方法根据给定的 <code class=\"docutils literal notranslate\">kwargs</code> 尝试从数据库中获取一个对象。如果找到了匹配的对象，它就会更新 <code class=\"docutils literal notranslate\">defaults</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>defaults <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">}</span>\ncreate_defaults <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birthday&quot;</span><span class=\"p\">:</span> date<span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">)}</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    obj <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> key<span class=\"p\">,</span> value <span class=\"ow\">in</span> defaults<span class=\"o\">.</span>items<span class=\"p\">():</span>\n        <span class=\"nb\">setattr</span><span class=\"p\">(</span>obj<span class=\"p\">,</span> key<span class=\"p\">,</span> value<span class=\"p\">)</span>\n    obj<span class=\"o\">.</span>save<span class=\"p\">()</span>\n<span class=\"k\">except</span> Person<span class=\"o\">.</span>DoesNotExist<span class=\"p\">:</span>\n    new_values <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">}</span>\n    new_values<span class=\"o\">.</span>update<span class=\"p\">(</span>create_defaults<span class=\"p\">)</span>\n    obj <span class=\"o\">=</span> Person<span class=\"p\">(</span><span class=\"o\">**</span>new_values<span class=\"p\">)</span>\n    obj<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<p>当模型中的字段数量增加时，这种模式就会变得很笨重。上面的例子可以使用 <code class=\"docutils literal notranslate\">update_or_create()</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>obj<span class=\"p\">,</span> created <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>update_or_create<span class=\"p\">(</span>\n    first_name<span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span>\n    last_name<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">,</span>\n    defaults<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">},</span>\n    create_defaults<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birthday&quot;</span><span class=\"p\">:</span> date<span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">)},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>关于如何解决在 <code class=\"docutils literal notranslate\">kwargs</code> 中传递名字的详细描述，见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\">get_or_create()</code></a>。</p>\n<p>如上文 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\">get_or_create()</code></a> 中所述，这种方法容易出现竞争条件，如果不在数据库层面强制执行唯一性，就会导致同时插入多条记录。</p>\n<p>就像 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\">get_or_create()</code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.create\" title=\"django.db.models.query.QuerySet.create\"><code class=\"xref py py-meth docutils literal notranslate\">create()</code></a> 一样，如果你使用的是手动指定的主键，需要创建一个对象，但该键已经存在于数据库中，就会引发 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\">IntegrityError</code></a>。</p>\n</section>\n<section id=\"bulk-create\">\n<h4><code class=\"docutils literal notranslate\">bulk_create()</code><a class=\"heading-anchor\" href=\"#bulk-create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.bulk_create\">\n<span class=\"sig-name descname\">bulk_create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">objs</em>, <em class=\"sig-param\">batch_size<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">ignore_conflicts<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">update_conflicts<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">update_fields<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">unique_fields<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.bulk_create\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.abulk_create\">\n<span class=\"sig-name descname\">abulk_create</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">objs</em>, <em class=\"sig-param\">batch_size<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">ignore_conflicts<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">update_conflicts<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">update_fields<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">unique_fields<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.abulk_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">abulk_create()</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>objs <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>bulk_create<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"p\">[</span>\n<span class=\"gp\">... </span>        Entry<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;This is a test&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        Entry<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;This is only a test&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<ul>\n<li><p>The model's <code class=\"docutils literal notranslate\">save()</code> method <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#methods-not-called-on-bulk-operations\"><span class=\"std std-ref\">will not be called</span></a>, and the <code class=\"docutils literal notranslate\">pre_save</code> and\n<code class=\"docutils literal notranslate\">post_save</code> signals will not be sent.</p></li>\n<li><p>在多表继承的情况下，它不能与子模型一起工作。</p></li>\n<li><p>If the model's primary key is an <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</code></a> or has\na <a class=\"reference internal\" href=\"/zh-hans/6.1/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\">db_default</code></a> value, and <code class=\"docutils literal notranslate\">ignore_conflicts</code>\nis <code class=\"docutils literal notranslate\">False</code>, the primary key attribute can only be retrieved on certain\ndatabases (currently PostgreSQL, MariaDB, and SQLite). On other databases, it\nwill not be set.</p></li>\n<li><p>对于多对多的关系，它是行不通的。</p></li>\n<li><p>它将 <code class=\"docutils literal notranslate\">objs</code> 转换为一个列表，如果 <code class=\"docutils literal notranslate\">objs</code> 是一个生成器，则完全执行 <code class=\"docutils literal notranslate\">objs</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\">itertools</span> <span class=\"kn\">import</span> islice\n\nbatch_size <span class=\"o\">=</span> <span class=\"mi\">100</span>\nobjs <span class=\"o\">=</span> <span class=\"p\">(</span>Entry<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;Test </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> i<span class=\"p\">)</span> <span class=\"k\">for</span> i <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1000</span><span class=\"p\">))</span>\n<span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n    batch <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span>islice<span class=\"p\">(</span>objs<span class=\"p\">,</span> batch_size<span class=\"p\">))</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> batch<span class=\"p\">:</span>\n        <span class=\"k\">break</span>\n    Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>bulk_create<span class=\"p\">(</span>batch<span class=\"p\">,</span> batch_size<span class=\"p\">)</span>\n</code></pre></div>\n</li>\n</ul>\n<p>The <code class=\"docutils literal notranslate\">batch_size</code> parameter controls how many objects are created in a single\nquery. The default is to create as many objects in one batch as the database\nwill allow. (SQLite and Oracle limit the number of parameters in a query.)</p>\n<p>在支持的数据库上（除了 Oracle），将 <code class=\"docutils literal notranslate\">ignore_conflicts</code> 参数设置为 <code class=\"docutils literal notranslate\">True</code> 告诉数据库忽略插入失败的行，例如违反唯一值约束的行。</p>\n<p>在支持它的数据库上（除了 Oracle），将 <code class=\"docutils literal notranslate\">update_conflicts</code> 参数设置为 <code class=\"docutils literal notranslate\">True</code>，告诉数据库在冲突时更新 <code class=\"docutils literal notranslate\">update_fields</code>。在 PostgreSQL 和 SQLite 上，除了 <code class=\"docutils literal notranslate\">update_fields</code>，还必须提供可能冲突的 <code class=\"docutils literal notranslate\">unique_fields</code> 列表。</p>\n<p>启用 <code class=\"docutils literal notranslate\">ignore_conflicts</code> 参数会禁用在每个模型实例上设置主键（如果数据库通常支持它）。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>在 MySQL 和 MariaDB 上，将 <code class=\"docutils literal notranslate\">ignore_conflicts</code> 参数设置为 <code class=\"docutils literal notranslate\">True</code> 将某些类型的错误，除了重复键之外，变成警告。即使在严格模式下也是如此。例如：无效值或不可空值违规。更多细节请参见 <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-mode.html#ignore-strict-comparison\">MySQL documentation</a> 和 <a class=\"reference external\" href=\"https://mariadb.com/kb/en/ignore/\">MariaDB documentation</a> 。</p>\n</aside>\n</section>\n<section id=\"bulk-update\">\n<h4><code class=\"docutils literal notranslate\">bulk_update()</code><a class=\"heading-anchor\" href=\"#bulk-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.bulk_update\">\n<span class=\"sig-name descname\">bulk_update</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">objs</em>, <em class=\"sig-param\">fields</em>, <em class=\"sig-param\">batch_size<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.bulk_update\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.abulk_update\">\n<span class=\"sig-name descname\">abulk_update</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">objs</em>, <em class=\"sig-param\">fields</em>, <em class=\"sig-param\">batch_size<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.abulk_update\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">abulk_update()</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>objs <span class=\"o\">=</span> <span class=\"p\">[</span>\n<span class=\"gp\">... </span>    Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;Entry 1&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>headline<span class=\"o\">=</span><span class=\"s2\">&quot;Entry 2&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>objs<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span>headline <span class=\"o\">=</span> <span class=\"s2\">&quot;This is entry 1&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>objs<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span>headline <span class=\"o\">=</span> <span class=\"s2\">&quot;This is entry 2&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>bulk_update<span class=\"p\">(</span>objs<span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">2</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.update()</code></a> 用于保存更改，所以这比遍历模型列表并对每个模型调用 <code class=\"docutils literal notranslate\">save()</code> 更有效，但它有一些注意事项：</p>\n<ul>\n<li><p>你不能更新模型的主键。</p></li>\n<li><p>Each model's <code class=\"docutils literal notranslate\">save()</code> method <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#methods-not-called-on-bulk-operations\"><span class=\"std std-ref\">isn't called</span></a>, and the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-attr docutils literal notranslate\">pre_save</code></a> and\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-attr docutils literal notranslate\">post_save</code></a> signals aren't sent.</p></li>\n<li><p>如果更新大量行中的大量列，生成的 SQL 可能非常大。通过指定一个合适的 <code class=\"docutils literal notranslate\">batch_size</code> 来避免这种情况。</p></li>\n<li><p>When updating a large number of objects, be aware that <code class=\"docutils literal notranslate\">bulk_update()</code>\nprepares all of the <code class=\"docutils literal notranslate\">WHEN</code> clauses for every object across all batches\nbefore executing any queries. This can require more memory than expected. To\nreduce memory usage, you can use an approach like this:</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\">itertools</span> <span class=\"kn\">import</span> islice\n\nbatch_size <span class=\"o\">=</span> <span class=\"mi\">100</span>\nids_iter <span class=\"o\">=</span> <span class=\"nb\">iter</span><span class=\"p\">(</span><span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1000</span><span class=\"p\">))</span>\n<span class=\"k\">while</span> ids <span class=\"o\">:=</span> <span class=\"nb\">list</span><span class=\"p\">(</span>islice<span class=\"p\">(</span>ids_iter<span class=\"p\">,</span> batch_size<span class=\"p\">)):</span>\n    batch <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>id__in<span class=\"o\">=</span>ids<span class=\"p\">)</span>\n    <span class=\"k\">for</span> entry <span class=\"ow\">in</span> batch<span class=\"p\">:</span>\n        entry<span class=\"o\">.</span>headline <span class=\"o\">=</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;Updated headline </span><span class=\"si\">{</span>entry<span class=\"o\">.</span>pk<span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n    Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>bulk_update<span class=\"p\">(</span>batch<span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">],</span> batch_size<span class=\"o\">=</span>batch_size<span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>更新定义在多表继承祖先上的字段将给每个祖先带来额外的查询。</p></li>\n<li><p>当一个单独的批次包含重复的内容时，只有该批次的第一个实例会导致更新。</p></li>\n<li><p>该函数返回的更新对象的数量可能少于传入的对象的数量。这可能是由于传入的对象重复，在同一批次中被更新，或者是竞赛条件，如对象在数据库中不再存在。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">batch_size</code> 参数控制一次查询中保存多少对象。默认值是在一个批次中更新所有对象，但 SQLite 和 Oracle 除外，它们对查询中使用的变量数量有限制。</p>\n</section>\n<section id=\"count\">\n<h4><code class=\"docutils literal notranslate\">count()</code><a class=\"heading-anchor\" href=\"#count\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.count\">\n<span class=\"sig-name descname\">count</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.count\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.acount\">\n<span class=\"sig-name descname\">acount</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.acount\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">acount()</code></p>\n<p>返回一个整数，表示数据库中与 <code class=\"docutils literal notranslate\">QuerySet</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=\"c1\"># Returns the total number of entries in the database.</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>count<span class=\"p\">()</span>\n\n<span class=\"c1\"># Returns the number of entries whose headline contains &#39;Lennon&#39;</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>count<span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">count()</code> 调用在幕后执行 <code class=\"docutils literal notranslate\">SELECT COUNT(*)</code>，所以你应该总是使用 <code class=\"docutils literal notranslate\">count()</code> 而不是将所有的记录加载到 Python 对象中，然后在结果上调用 <code class=\"docutils literal notranslate\">len()</code> （除非你需要将对象加载到内存中，在这种情况下 <code class=\"docutils literal notranslate\">len()</code> 会更快）。</p>\n<p>请注意，如果你想知道 <code class=\"docutils literal notranslate\">QuerySet</code> 中的项数，并且也要从它中检索模型实例（例如，通过迭代它），那么使用 <code class=\"docutils literal notranslate\">len(queryset)</code> 可能更有效，因为它不会像 <code class=\"docutils literal notranslate\">count()</code> 那样引起额外的数据库查询。</p>\n<p>如果查询集已经被完全检索到，<code class=\"docutils literal notranslate\">count()</code> 将使用该长度，而不是执行额外的数据库查询。</p>\n</section>\n<section id=\"in-bulk\">\n<h4><code class=\"docutils literal notranslate\">in_bulk()</code><a class=\"heading-anchor\" href=\"#in-bulk\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.in_bulk\">\n<span class=\"sig-name descname\">in_bulk</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">id_list<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">field_name<span class=\"o\">=</span><span class=\"default_value\">'pk'</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.in_bulk\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.ain_bulk\">\n<span class=\"sig-name descname\">ain_bulk</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">id_list<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">field_name<span class=\"o\">=</span><span class=\"default_value\">'pk'</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.ain_bulk\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">ain_bulk()</code></p>\n<p>接收一个字段值的列表（<code class=\"docutils literal notranslate\">id_list</code>）和这些值的 <code class=\"docutils literal notranslate\">field_name</code>，并返回一个字典，将每个值映射到具有给定字段值的对象实例。<code class=\"docutils literal notranslate\">in_bulk</code> 不会引发任何 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">django.core.exceptions.ObjectDoesNotExist</code></a> 异常；也就是说，任何不匹配任何实例的 <code class=\"docutils literal notranslate\">id_list</code> 值将被简单地忽略掉。如果没有提供 <code class=\"docutils literal notranslate\">id_list</code>，将返回查询集的所有对象。<code class=\"docutils literal notranslate\">field_name</code> 必须是一个唯一字段或一个独立的字段（如果只有一个字段在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\">distinct()</code></a> 中指定）。<code class=\"docutils literal notranslate\">field_name</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>in_bulk<span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>in_bulk<span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">])</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;, 2: &lt;Blog: Cheddar Talk&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>in_bulk<span class=\"p\">([])</span>\n<span class=\"go\">{}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>in_bulk<span class=\"p\">()</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;, 2: &lt;Blog: Cheddar Talk&gt;, 3: &lt;Blog: Django Weblog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>in_bulk<span class=\"p\">([</span><span class=\"s2\">&quot;beatles_blog&quot;</span><span class=\"p\">],</span> field_name<span class=\"o\">=</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;beatles_blog&#39;: &lt;Blog: Beatles Blog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>distinct<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>in_bulk<span class=\"p\">(</span>field_name<span class=\"o\">=</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;Beatles Blog&#39;: &lt;Blog: Beatles Blog&gt;, &#39;Cheddar Talk&#39;: &lt;Blog: Cheddar Talk&gt;, &#39;Django Weblog&#39;: &lt;Blog: Django Weblog&gt;}</span>\n</code></pre></div>\n<p>如果你传递 <code class=\"docutils literal notranslate\">in_bulk()</code> 一个空列表，你将得到一个空字典。</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>Support for chaining <code class=\"docutils literal notranslate\">in_bulk()</code> after <a class=\"reference internal\" href=\"#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> or\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\">values_list()</code></a> was added.</p>\n</aside>\n</section>\n<section id=\"iterator\">\n<h4><code class=\"docutils literal notranslate\">iterator()</code><a class=\"heading-anchor\" href=\"#iterator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.iterator\">\n<span class=\"sig-name descname\">iterator</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">chunk_size<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.iterator\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aiterator\">\n<span class=\"sig-name descname\">aiterator</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">chunk_size<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aiterator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aiterator()</code></p>\n<p>Evaluates the <code class=\"docutils literal notranslate\">QuerySet</code> (by performing the query) and returns an\n<a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-iterator\" title=\"(in Python v3.14)\"><span>iterator</span></a> over the results, or an <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-asynchronous-iterator\" title=\"(in Python v3.14)\"><span>asynchronous\niterator</span></a> if you call its asynchronous version <code class=\"docutils literal notranslate\">aiterator</code>.</p>\n<p>A <code class=\"docutils literal notranslate\">QuerySet</code> typically caches its results internally so that repeated\nevaluations do not result in additional queries. In contrast, <code class=\"docutils literal notranslate\">iterator()</code>\nwill read results directly, without doing any caching at the <code class=\"docutils literal notranslate\">QuerySet</code>\nlevel. For a <code class=\"docutils literal notranslate\">QuerySet</code> which returns a large number of objects that you\nonly need to access once, this can result in better performance and a\nsignificant reduction in memory.</p>\n<p>请注意，在已经被执行的 <code class=\"docutils literal notranslate\">QuerySet</code> 上使用 <code class=\"docutils literal notranslate\">iterator()</code> 会迫使它再次执行，重复查询。</p>\n<p><code class=\"docutils literal notranslate\">iterator()</code> 与之前对 <code class=\"docutils literal notranslate\">prefetch_related()</code> 的调用兼容，只要提供了 <code class=\"docutils literal notranslate\">chunk_size</code>。较大的值将需要更少的查询来完成预取操作，但代价是更多的内存使用。</p>\n<p>在某些数据库（例如 Oracle，SQLite）中，SQL 中的 <code class=\"docutils literal notranslate\">IN</code> 子句中的最大项数可能会受到限制。因此，应使用低于此限制的值。特别是在跨两个或多个关系进行预取的情况下，<code class=\"docutils literal notranslate\">chunk_size</code> 应该足够小，以便每个预取关系的预期结果数量仍然保持在限制以下。</p>\n<p>只要 QuerySet 不预取任何相关对象，不为 <code class=\"docutils literal notranslate\">chunk_size</code> 提供值，Django 将使用默认的隐式值 2000。</p>\n<p>根据数据库后端，查询结果将被一次性加载或使用服务器端的游标从数据库中流转。</p>\n<section id=\"with-server-side-cursors\">\n<h5>使用服务器端游标<a class=\"heading-anchor\" href=\"#with-server-side-cursors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>Oracle 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#postgresql-server-side-cursors\"><span class=\"std std-ref\">PostgreSQL</span></a> 使用服务器端的游标从数据库流式传输结果，而不需要将整个结果集加载到内存中。</p>\n<p>Oracle 数据库驱动程序总是使用服务器端的游标。</p>\n<p>对于服务器端的游标，<code class=\"docutils literal notranslate\">chunk_size</code> 参数指定了要在数据库驱动层缓存的结果数量。获取更大的块数会减少数据库驱动和数据库之间的往返次数，但会牺牲内存。</p>\n<p>在 PostgreSQL 上，只有当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS\"><code class=\"xref std std-setting docutils literal notranslate\">DISABLE_SERVER_SIDE_CURSORS</code></a> 设置为 <code class=\"docutils literal notranslate\">False</code> 时，才会使用服务器端游标。如果你使用的是配置在事务池模式下的连接池器，请阅读 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#transaction-pooling-server-side-cursors\"><span class=\"std std-ref\">事务池和服务器端游标</span></a>。当禁用服务器端游标时，其行为与不支持服务器端游标的数据库相同。</p>\n</section>\n<section id=\"without-server-side-cursors\">\n<h5>没有服务器端游标<a class=\"heading-anchor\" href=\"#without-server-side-cursors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>MySQL 不支持流式结果，因此 Python 数据库驱动将整个结果集加载到内存中。然后数据库适配器使用 <span class=\"target\" id=\"index-5\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a> 中定义的 <code class=\"docutils literal notranslate\">fetchmany()</code> 方法将结果集转化为 Python 行对象。</p>\n<p>SQLite 可以使用 <code class=\"docutils literal notranslate\">fetchmany()</code> 分批获取结果，但由于 SQLite 不提供连接内查询之间的隔离，所以在向被迭代的表写入时要小心。参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#sqlite-isolation\"><span class=\"std std-ref\">使用 QuerySet.iterator() 时的隔离</span></a> 了解更多信息。</p>\n<p><code class=\"docutils literal notranslate\">chunk_size</code> 参数控制 Django 从数据库驱动中获取的批次大小。批量越大，就会减少与数据库驱动通信的开销，但代价是略微增加内存消耗。</p>\n<p>只要查询集不预取任何相关对象，不提供 <code class=\"docutils literal notranslate\">chunk_size</code> 的值将导致 Django 使用隐式默认值 2000，这个值是从 <a class=\"reference external\" href=\"https://www.postgresql.org/message-id/4D2F2C71.8080805%40dndg.it\">psycopg 邮件列表上的计算</a> 推导出的。</p>\n<blockquote>\n<div><p>假设行数为 10-20 列，文字数据和数字数据混合，2000 要取不到 100KB 的数据，这似乎是一个很好的折中方案，在传输的行数和提前退出循环时丢弃的数据之间。</p>\n</div></blockquote>\n</section>\n</section>\n<section id=\"latest\">\n<h4><code class=\"docutils literal notranslate\">latest()</code><a class=\"heading-anchor\" href=\"#latest\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.latest\">\n<span class=\"sig-name descname\">latest</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.latest\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.alatest\">\n<span class=\"sig-name descname\">alatest</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.alatest\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">alatest()</code></p>\n<p>根据给定的字段，返回表中最新的对象。</p>\n<p>这个例子根据 <code class=\"docutils literal notranslate\">pub_date</code> 字段返回表中最新的 <code class=\"docutils literal notranslate\">Entry</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>latest<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你也可以根据几个字段选择最新的。例如，当两个条目具有相同的 <code class=\"docutils literal notranslate\">pub_date</code> 时，要选择最早的 <code class=\"docutils literal notranslate\">expire_date</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>latest<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;-expire_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">'-expire_date'</code> 中的负号表示按 <em>降</em> 序排列 <code class=\"docutils literal notranslate\">expire_date</code>。由于 <code class=\"docutils literal notranslate\">latest()</code> 得到的是最后一个结果，所以选择了最早的 <code class=\"docutils literal notranslate\">expire_date</code> 的 <code class=\"docutils literal notranslate\">Entry</code>。</p>\n<p>如果你模型的 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#meta-options\"><span class=\"std std-ref\">Meta</span></a> 指定了 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.get_latest_by\" title=\"django.db.models.Options.get_latest_by\"><code class=\"xref py py-attr docutils literal notranslate\">get_latest_by</code></a>，你可以省略 <code class=\"docutils literal notranslate\">earliest()</code> 或 <code class=\"docutils literal notranslate\">latest()</code> 的任何参数。<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.get_latest_by\" title=\"django.db.models.Options.get_latest_by\"><code class=\"xref py py-attr docutils literal notranslate\">get_latest_by</code></a> 中指定的字段将被默认使用。</p>\n<p>Like <a class=\"reference internal\" href=\"#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\">earliest()</code> and <code class=\"docutils literal notranslate\">latest()</code> raise\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\">DoesNotExist</code></a> if there is no object with the\ngiven parameters.</p>\n<p>请注意，<code class=\"docutils literal notranslate\">earliest()</code> 和 <code class=\"docutils literal notranslate\">latest()</code> 的存在纯粹是为了方便和可读性。</p>\n<aside class=\"admonition-earliest-and-latest-may-return-instances-with-null-dates admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">earliest()</code> 和 <code class=\"docutils literal notranslate\">latest()</code> 可能返回日期为空的实例。</p>\n<p>由于排序是委托给数据库的，如果使用不同的数据库，允许空值的字段上的结果可能会有不同的排序。例如，PostgreSQL 和 MySQL 将空值排序为高于非空值，而 SQLite 则相反。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__isnull<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span><span class=\"o\">.</span>latest<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"earliest\">\n<h4><code class=\"docutils literal notranslate\">earliest()</code><a class=\"heading-anchor\" href=\"#earliest\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.earliest\">\n<span class=\"sig-name descname\">earliest</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.earliest\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aearliest\">\n<span class=\"sig-name descname\">aearliest</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>fields</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aearliest\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aearliest()</code></p>\n<p>除了方向改变外，其他工作方式都像 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.last\" title=\"django.db.models.query.QuerySet.last\"><code class=\"xref py py-meth docutils literal notranslate\">last()</code></a>。</p>\n</section>\n<section id=\"first\">\n<h4><code class=\"docutils literal notranslate\">first()</code><a class=\"heading-anchor\" href=\"#first\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.first\">\n<span class=\"sig-name descname\">first</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.first\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.afirst\">\n<span class=\"sig-name descname\">afirst</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.afirst\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">afirst()</code></p>\n<p>Returns the first object matched by the queryset, or <code class=\"docutils literal notranslate\">None</code> if there\nis no matching object. If the <code class=\"docutils literal notranslate\">QuerySet</code> has no ordering defined (and has not\nhad ordering forcibly cleared by calling <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> with no arguments),\nthen the queryset is automatically ordered by the primary key. This can affect\naggregation results as described in <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/aggregation/#aggregation-ordering-interaction\"><span class=\"std std-ref\">Interaction with order_by()</span></a>.</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>p <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>first<span class=\"p\">()</span>\n</code></pre></div>\n<p>请注意，<code class=\"docutils literal notranslate\">first()</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=\"k\">try</span><span class=\"p\">:</span>\n    p <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"k\">except</span> <span class=\"ne\">IndexError</span><span class=\"p\">:</span>\n    p <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p><code class=\"docutils literal notranslate\">first()</code> and <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.last\" title=\"django.db.models.query.QuerySet.last\"><code class=\"xref py py-meth docutils literal notranslate\">last()</code></a> no longer order by the primary key when\nordering has been forcibly cleared by calling <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">order_by()</code></a> with no\narguments.</p>\n</aside>\n</section>\n<section id=\"last\">\n<h4><code class=\"docutils literal notranslate\">last()</code><a class=\"heading-anchor\" href=\"#last\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.last\">\n<span class=\"sig-name descname\">last</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.last\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.alast\">\n<span class=\"sig-name descname\">alast</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.alast\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">alast()</code></p>\n<p>Works like  <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.first\" title=\"django.db.models.query.QuerySet.first\"><code class=\"xref py py-meth docutils literal notranslate\">first()</code></a>, but returns the last object in the queryset.</p>\n</section>\n<section id=\"aggregate\">\n<h4><code class=\"docutils literal notranslate\">aggregate()</code><a class=\"heading-anchor\" href=\"#aggregate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aggregate\">\n<span class=\"sig-name descname\">aggregate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aggregate\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aaggregate\">\n<span class=\"sig-name descname\">aaggregate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aaggregate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aaggregate()</code></p>\n<p>返回对 <code class=\"docutils literal notranslate\">QuerySet</code> 计算的聚合值（平均值、总和等）的字典。<code class=\"docutils literal notranslate\">aggregate()</code> 的每个参数都指定了一个将被包含在返回的字典中的值。</p>\n<p>Django 提供的聚合函数在下面的 <a class=\"reference internal\" href=\"#id6\">Aggregation Functions</a> 中介绍。由于聚合函数也是 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a>，所以你可以将聚合函数与其他聚合函数或值结合起来，创建复杂的聚合函数。</p>\n<p>使用关键字参数指定的聚合将使用关键字作为注解的名称。匿名参数将根据聚合函数的名称和被聚合的模型字段为其生成一个名称。复杂的聚合不能使用匿名参数，必须指定一个关键字参数作为别名。</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> Count\n<span class=\"gp\">&gt;&gt;&gt; </span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;entry__authors__count&#39;: 16}</span>\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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>aggregate<span class=\"p\">(</span>number_of_authors<span class=\"o\">=</span>Count<span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;number_of_authors&#39;: 16}</span>\n</code></pre></div>\n<p>关于聚合的深入讨论，见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/aggregation/\"><span class=\"doc\">关于聚合的专题指南</span></a>。</p>\n</section>\n<section id=\"exists\">\n<h4><code class=\"docutils literal notranslate\">exists()</code><a class=\"heading-anchor\" href=\"#exists\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.exists\">\n<span class=\"sig-name descname\">exists</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.exists\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aexists\">\n<span class=\"sig-name descname\">aexists</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aexists\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aexists()</code></p>\n<p>如果 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 包含任何结果，则返回 <code class=\"docutils literal notranslate\">True</code>，如果不包含，则返回 <code class=\"docutils literal notranslate\">False</code>。该函数试图以最简单、最快速的方式执行查询，但它 <em>执行</em> 的查询与普通的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 查询几乎相同。</p>\n<p><code class=\"xref py py-meth docutils literal notranslate\">existence()</code> 对于与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 中任何对象的存在有关的搜索很有用，特别是在一个大的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 的背景下。</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\">if</span> some_queryset<span class=\"o\">.</span>exists<span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one object in some_queryset&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\">if</span> some_queryset<span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one object in some_queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...但程度不高（因此需要大量的查询集才能获得效率提升）。</p>\n<p>此外，如果一个 <code class=\"docutils literal notranslate\">some_queryset</code> 还没有被执行，但你知道它会在某个时候被执行，那么使用 <code class=\"docutils literal notranslate\">some_queryset.exences()</code> 比使用 <code class=\"docutils literal notranslate\">bool(some_queryset)</code> 会做更多的总体工作（一个存在性检查的查询加上一个额外的查询，以便以后检索结果），后者检索结果，然后检查是否有任何返回。</p>\n</section>\n<section id=\"contains\">\n<h4><code class=\"docutils literal notranslate\">contains()</code><a class=\"heading-anchor\" href=\"#contains\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.contains\">\n<span class=\"sig-name descname\">contains</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">obj</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.contains\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.acontains\">\n<span class=\"sig-name descname\">acontains</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">obj</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.acontains\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">acontains()</code></p>\n<p>如果 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 包含 <code class=\"docutils literal notranslate\">obj</code>，返回 <code class=\"docutils literal notranslate\">True</code>，如果不包含 <code class=\"docutils literal notranslate\">False</code>。这试图以最简单和最快的方式执行查询。</p>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.contains\" title=\"django.db.models.query.QuerySet.contains\"><code class=\"xref py py-meth docutils literal notranslate\">contains()</code></a> 对于检查一个对象在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 中的成员资格很有用，特别是在一个大的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 的情况下。</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\">if</span> some_queryset<span class=\"o\">.</span>contains<span class=\"p\">(</span>obj<span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Entry contained in queryset&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\">if</span> obj <span class=\"ow\">in</span> some_queryset<span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Entry contained in queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>像 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\">exists()</code></a> 一样，如果 <code class=\"docutils literal notranslate\">some_queryset</code> 还没有被执行，但你知道它将在某个时候被执行，那么使用 <code class=\"docutils literal notranslate\">some_queryset.contains(obj)</code> 将进行额外的数据库查询，通常会导致整体性能变慢。</p>\n</section>\n<section id=\"update\">\n<h4><code class=\"docutils literal notranslate\">update()</code><a class=\"heading-anchor\" href=\"#update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.update\">\n<span class=\"sig-name descname\">update</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.update\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aupdate\">\n<span class=\"sig-name descname\">aupdate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aupdate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aupdate()</code></p>\n<p>对指定的字段执行 SQL 更新查询，并返回匹配的行数（如果有些行已经有了新的值，则可能不等于更新的行数）。</p>\n<p>例如，要关闭所有在 2010 年发布的博客条目的评论，你可以这样做：</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>comments_on<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（假定你的 <code class=\"docutils literal notranslate\">Entry</code> 模型有 <code class=\"docutils literal notranslate\">pub_date</code> 和 <code class=\"docutils literal notranslate\">comments_on</code>。）</p>\n<p>你可以更新多个字段，没有限制。例如，这里我们更新了 <code class=\"docutils literal notranslate\">comments_on</code> 和 <code class=\"docutils literal notranslate\">headline</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    comments_on<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> headline<span class=\"o\">=</span><span class=\"s2\">&quot;This is old&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">update()</code> 方法会立即应用，并且被更新的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 的唯一限制是它只能更新模型主表中的列，不能更新相关模型上的列。例如，你不能这样做：</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>blog__name<span class=\"o\">=</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># Won&#39;t work!</span>\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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__id<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>comments_on<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你不能在一个 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 上调用 <code class=\"docutils literal notranslate\">update()</code>，因为它已经被取走了一个片断或者不能再被过滤。</p>\n<p><code class=\"docutils literal notranslate\">update()</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">64</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>comments_on<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">1</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>slug<span class=\"o\">=</span><span class=\"s2\">&quot;nonexistent-slug&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>comments_on<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">0</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>comments_on<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"go\">132</span>\n</code></pre></div>\n<p>如果你只是更新一条记录，不需要对模型对象做任何事情，最有效的方法是调用 <code class=\"docutils literal notranslate\">update()</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>e <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\ne<span class=\"o\">.</span>comments_on <span class=\"o\">=</span> <span class=\"kc\">False</span>\ne<span class=\"o\">.</span>save<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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>comments_on<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>使用 <code class=\"docutils literal notranslate\">update()</code> 还可以防止在加载对象和调用 <code class=\"docutils literal notranslate\">save()</code> 之间的短暂时间内数据库中的某些东西可能发生变化的竞争条件。</p>\n<aside class=\"admonition-mysql-does-not-support-self-select-updates admonition\" role=\"note\">\n<p class=\"admonition-title\">MySQL does not support self-select updates</p>\n<p>On MySQL, <code class=\"docutils literal notranslate\">QuerySet.update()</code> may execute a <code class=\"docutils literal notranslate\">SELECT</code> followed by an\n<code class=\"docutils literal notranslate\">UPDATE</code> instead of a single <code class=\"docutils literal notranslate\">UPDATE</code> when filtering on related tables,\nwhich can introduce a race condition if concurrent changes occur between\nthe queries. To ensure atomicity, consider using transactions or avoiding\nsuch filter conditions on MySQL.</p>\n</aside>\n<p>Finally, realize that <code class=\"docutils literal notranslate\">update()</code> does an update at the SQL level and, thus,\nmethod <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#methods-not-called-on-bulk-operations\"><span class=\"std std-ref\">does not call</span></a> any\n<code class=\"docutils literal notranslate\">save()</code> methods on your models, nor does it emit the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-attr docutils literal notranslate\">pre_save</code></a> or\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-attr docutils literal notranslate\">post_save</code></a> signals (which are a consequence of\ncalling <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">Model.save()</code></a>). If you want to\nupdate a bunch of records for a model that has a custom\n<a class=\"reference internal\" href=\"/zh-hans/6.1/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> method, loop over them and call\n<a class=\"reference internal\" href=\"/zh-hans/6.1/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>, like this:</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\">for</span> e <span class=\"ow\">in</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">):</span>\n    e<span class=\"o\">.</span>comments_on <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    e<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"ordered-queryset\">\n<h5>有序的查询集<a class=\"heading-anchor\" href=\"#ordered-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>将 <code class=\"docutils literal notranslate\">order_by()</code> 与 <code class=\"docutils literal notranslate\">update()</code> 串联起来，只在 MariaDB 和 MySQL 上支持，对于不同的数据库会被忽略。这对于按照指定的顺序更新一个唯一的字段是很有用的，没有冲突。例如：</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-number&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>update<span class=\"p\">(</span>number<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;number&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\">order_by()</code> 子句如果包含注释、继承字段或跨越关系的查找，将被忽略。</p>\n</aside>\n</section>\n</section>\n<section id=\"delete\">\n<h4><code class=\"docutils literal notranslate\">delete()</code><a class=\"heading-anchor\" href=\"#delete\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.delete\">\n<span class=\"sig-name descname\">delete</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.delete\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.adelete\">\n<span class=\"sig-name descname\">adelete</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.adelete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">adelete()</code></p>\n<p>Performs an SQL delete query on all rows in the <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> and\nreturns the number of objects deleted and a dictionary with the number of\ndeletions per object type. The return value will count instances from related\nmodels if Django is emulating cascade behavior via Python\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\">on_delete</code></a> variants. Otherwise, for\ndatabase variants such as <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.DB_CASCADE\" title=\"django.db.models.DB_CASCADE\"><code class=\"xref py py-attr docutils literal notranslate\">DB_CASCADE</code></a>, the return\nvalue will report only instances of the <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a>'s model.</p>\n<p><code class=\"docutils literal notranslate\">delete()</code> 是即时应用的。你不能对已经被取走一个片断或不能再被过滤的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 调用 <code class=\"docutils literal notranslate\">delete()</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>b <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Delete all the entries belonging to this Blog.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog<span class=\"o\">=</span>b<span class=\"p\">)</span><span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"go\">(4, {&#39;blog.Entry&#39;: 2, &#39;blog.Entry_authors&#39;: 2})</span>\n</code></pre></div>\n<p>默认情况下，Django 的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> 模拟了 SQL 约束 <code class=\"docutils literal notranslate\">ON DELETE CASCADE</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>blogs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n\n<span class=\"go\"># This will delete all Blogs and all of their Entry objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>blogs<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n<span class=\"go\">(5, {&#39;blog.Blog&#39;: 1, &#39;blog.Entry&#39;: 2, &#39;blog.Entry_authors&#39;: 2})</span>\n</code></pre></div>\n<p>这种级联行为通过 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> 的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\">on_delete</code></a> 参数定义。</p>\n<p>The <code class=\"docutils literal notranslate\">delete()</code> method does a bulk delete and <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#methods-not-called-on-bulk-operations\"><span class=\"std std-ref\">does not call</span></a> any <code class=\"docutils literal notranslate\">delete()</code> methods on your\nmodels. It does, however, emit the <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\">pre_delete</code></a>\nand <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.post_delete\" title=\"django.db.models.signals.post_delete\"><code class=\"xref py py-data docutils literal notranslate\">post_delete</code></a> signals for all deleted\nobjects (including cascaded deletions). Signals won't be sent when\n<code class=\"docutils literal notranslate\">DB_CASCADE</code> is used. Also, <code class=\"docutils literal notranslate\">delete()</code> doesn't return information about\nobjects deleted from database variants (<code class=\"docutils literal notranslate\">DB_*</code>) of the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\">on_delete</code></a> argument, e.g. <code class=\"docutils literal notranslate\">DB_CASCADE</code>.</p>\n<p>Django won’t need to fetch objects into memory when deleting them in the\nfollowing cases:</p>\n<ol class=\"arabic simple\">\n<li><p>If related fields use <code class=\"docutils literal notranslate\">DB_*</code> options.</p></li>\n<li><p>If there are no cascades and no delete signal receivers.</p></li>\n</ol>\n<p>In these cases, Django may take a fast path and delete objects without fetching\nthem, which can result in significantly reduced memory usage and fewer executed\nqueries.</p>\n<p>设置为 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\">on_delete</code></a> <code class=\"docutils literal notranslate\">DO_NOTHING</code> 的外键不会阻止在删除时采取快速路径。</p>\n<p>需要注意的是，对象删除中产生的查询是一个实现细节，可能会发生变化。</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>Support for the <code class=\"docutils literal notranslate\">DB_*</code> variants of <code class=\"docutils literal notranslate\">on_delete</code> attribute was added.</p>\n</aside>\n</section>\n<section id=\"as-manager\">\n<h4><code class=\"docutils literal notranslate\">as_manager()</code><a class=\"heading-anchor\" href=\"#as-manager\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.as_manager\">\n<em class=\"property\"><span class=\"k\">classmethod</span> </em><span class=\"sig-name descname\">as_manager</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.as_manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>类方法，该方法返回一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a> 的实例，其中包含 <code class=\"docutils literal notranslate\">QuerySet</code> 的方法的副本。详见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/managers/#create-manager-with-queryset-methods\"><span class=\"std std-ref\">创建带有 QuerySet 方法的管理器</span></a> 。</p>\n<p>请注意，与本节中的其他条目不同，这个条目没有异步变体，因为它不执行查询。</p>\n</section>\n<section id=\"explain\">\n<h4><code class=\"docutils literal notranslate\">explain()</code><a class=\"heading-anchor\" href=\"#explain\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.explain\">\n<span class=\"sig-name descname\">explain</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">format<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.explain\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aexplain\">\n<span class=\"sig-name descname\">aexplain</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">format<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aexplain\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\">aexplain()</code></p>\n<p>返回一个 <code class=\"docutils literal notranslate\">QuerySet</code> 的执行计划的字符串，它详细说明了数据库将如何执行查询，包括将使用的任何索引或联接。了解这些细节可以帮助你提高慢速查询的性能。</p>\n<p>例如，在使用 PostgreSQL 时：</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=\"nb\">print</span><span class=\"p\">(</span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;My Blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>explain<span class=\"p\">())</span>\n<span class=\"go\">Seq Scan on blog  (cost=0.00..35.50 rows=10 width=12)</span>\n<span class=\"go\">  Filter: (title = &#39;My Blog&#39;::bpchar)</span>\n</code></pre></div>\n<p>不同数据库之间的输出有很大的不同。</p>\n<p><code class=\"docutils literal notranslate\">explain()</code> 得到了所有内置数据库后端的支持，但 Oracle 除外，因为在那里的实现并不直接。</p>\n<p>The <code class=\"docutils literal notranslate\">format</code> parameter changes the output format from the database's\ndefault, which is usually text-based. PostgreSQL supports <code class=\"docutils literal notranslate\">'TEXT'</code>,\n<code class=\"docutils literal notranslate\">'JSON'</code>, <code class=\"docutils literal notranslate\">'YAML'</code>, and <code class=\"docutils literal notranslate\">'XML'</code> formats. MariaDB and MySQL support\n<code class=\"docutils literal notranslate\">'TEXT'</code> (also called <code class=\"docutils literal notranslate\">'TRADITIONAL'</code>) and <code class=\"docutils literal notranslate\">'JSON'</code> formats. MySQL\n8.0.16+ also supports an improved <code class=\"docutils literal notranslate\">'TREE'</code> format, which is similar to\nPostgreSQL's <code class=\"docutils literal notranslate\">'TEXT'</code> output and is used by default, if supported.</p>\n<p>一些数据库接受可以返回有关查询的更多信息的标志。将这些标志作为关键字参数传递。例如，在使用 PostgreSQL 时：</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=\"nb\">print</span><span class=\"p\">(</span>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;My Blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>explain<span class=\"p\">(</span>verbose<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> analyze<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n<span class=\"go\">Seq Scan on public.blog  (cost=0.00..35.50 rows=10 width=12) (actual time=0.004..0.004 rows=10 loops=1)</span>\n<span class=\"go\">  Output: id, title</span>\n<span class=\"go\">  Filter: (blog.title = &#39;My Blog&#39;::bpchar)</span>\n<span class=\"go\">Planning time: 0.064 ms</span>\n<span class=\"go\">Execution time: 0.058 ms</span>\n</code></pre></div>\n<p>On some databases, flags may cause the query to be executed which could have\nadverse effects on your database. For example, the <code class=\"docutils literal notranslate\">ANALYZE</code> flag supported\nby MariaDB, MySQL, and PostgreSQL could result in changes to data if there are\ntriggers or if a function is called, even for a <code class=\"docutils literal notranslate\">SELECT</code> query.</p>\n</section>\n</section>\n<section id=\"field-lookups\">\n<span id=\"id4\"></span><h3><code class=\"docutils literal notranslate\">Field</code> 查找<a class=\"heading-anchor\" href=\"#field-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Field lookups are how you specify the meat of an SQL <code class=\"docutils literal notranslate\">WHERE</code> clause. They're\nspecified as keyword arguments to the <code class=\"docutils literal notranslate\">QuerySet</code> methods <a class=\"reference internal\" href=\"#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>,\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\">exclude()</code></a> and <a class=\"reference internal\" href=\"#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>.</p>\n<p>介绍见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">模型和数据库查询文档</span></a>。</p>\n<p>Django 的内置查找功能如下。也可以为模型字段写 <a class=\"reference internal\" href=\"/zh-hans/6.1/howto/custom-lookups/\"><span class=\"doc\">自定义查找</span></a>。</p>\n<p>为方便起见，当没有提供查找类型时（如 <code class=\"docutils literal notranslate\">Entry.objects.get(id=14)</code>），查找类型被假定为 <a class=\"reference internal\" href=\"#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\">exact</code></a>。</p>\n<section id=\"exact\">\n<span id=\"std-fieldlookup-exact\"></span><h4><code class=\"docutils literal notranslate\">exact</code><a class=\"heading-anchor\" href=\"#exact\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Exact match. If the value provided for comparison is <code class=\"docutils literal notranslate\">None</code>, it will be\ninterpreted as an SQL <code class=\"docutils literal notranslate\">NULL</code> (see <a class=\"reference internal\" href=\"#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\">isnull</code></a> for more details).\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#std-fieldlookup-jsonfield.key\"><code class=\"xref std std-lookup docutils literal notranslate\">Key and index lookups</code></a> are exceptions: they\ninterpret <code class=\"docutils literal notranslate\">None</code> as JSON <code class=\"docutils literal notranslate\">null</code> instead.</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>id__exact<span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>id__exact<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> id <span class=\"o\">=</span> <span class=\"mi\">14</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> id <span class=\"k\">IS</span> <span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-mysql-comparisons admonition\" role=\"note\">\n<p class=\"admonition-title\">MySQL 比较</p>\n<p>在 MySQL 中，数据库表的“字符序”设置决定了 <code class=\"docutils literal notranslate\">act</code> 比较是否区分大小写。这是一个数据库设置，而 <em>不是</em> Django 设置。可以配置你的 MySQL 表来使用区分大小写的比较，但是会有一些折衷。关于这方面的更多信息，请参阅 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/\"><span class=\"doc\">数据库</span></a> 文档中的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#mysql-collation\"><span class=\"std std-ref\">字符序部分</span></a>。</p>\n</aside>\n</section>\n<section id=\"iexact\">\n<span id=\"std-fieldlookup-iexact\"></span><h4><code class=\"docutils literal notranslate\">iexact</code><a class=\"heading-anchor\" href=\"#iexact\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的完全匹配。如果提供的比较值是 <code class=\"docutils literal notranslate\">None</code>，它将被解释为 SQL <code class=\"docutils literal notranslate\">NULL</code> （详见 <a class=\"reference internal\" href=\"#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\">isnull</code></a>）。</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>Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name__iexact<span class=\"o\">=</span><span class=\"s2\">&quot;beatles blog&quot;</span><span class=\"p\">)</span>\nBlog<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name__iexact<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> name <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;beatles blog&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> name <span class=\"k\">IS</span> <span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>注意第一个查询会匹配 <code class=\"docutils literal notranslate\">'Beatles Blog'</code>、<code class=\"docutils literal notranslate\">'beatles blog'</code>、<code class=\"docutils literal notranslate\">'BeAtLes BLoG'</code> 等。</p>\n<aside class=\"admonition-sqlite-users admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后台和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。SQLite 对非 ASCII 字符串不进行区分大小写的匹配。</p>\n</aside>\n</section>\n<section id=\"std-fieldlookup-contains\">\n<span id=\"id5\"></span><h4><code class=\"docutils literal notranslate\">contains</code><a class=\"heading-anchor\" href=\"#std-fieldlookup-contains\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的包含测试。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>headline__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">LIKE</span> <span class=\"s1\">&#39;%Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>请注意，这将与标题 <code class=\"docutils literal notranslate\">'Lennon honored today'</code> 相匹配，而不是 <code class=\"docutils literal notranslate\">'lennon honored today'</code>。</p>\n<aside class=\"admonition-sqlite-users admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>SQLite 不支持区分大小写的 <code class=\"docutils literal notranslate\">LIKE</code> 语句；<code class=\"docutils literal notranslate\">contains</code> 的作用就像 SQLite 的 <code class=\"docutils literal notranslate\">icontains</code>。更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a>。</p>\n</aside>\n</section>\n<section id=\"icontains\">\n<span id=\"std-fieldlookup-icontains\"></span><h4><code class=\"docutils literal notranslate\">icontains</code><a class=\"heading-anchor\" href=\"#icontains\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的包含测试。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>headline__icontains<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<aside class=\"admonition-sqlite-users admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后端和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。</p>\n</aside>\n</section>\n<section id=\"in\">\n<span id=\"std-fieldlookup-in\"></span><h4><code class=\"docutils literal notranslate\">in</code><a class=\"heading-anchor\" href=\"#in\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>在一个给定的可迭代对象中；通常是一个列表、元组或查询集。这不是一个常见的用例，但字符串（可迭代）是可以接受的。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>id__in<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">])</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__in<span class=\"o\">=</span><span class=\"s2\">&quot;abc&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> id <span class=\"k\">IN</span> <span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">);</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">IN</span> <span class=\"p\">(</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;b&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;c&#39;</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>inner_qs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Cheddar&quot;</span><span class=\"p\">)</span>\nentries <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__in<span class=\"o\">=</span>inner_qs<span class=\"p\">)</span>\n</code></pre></div>\n<p>该查询集将作为子选择语句执行：</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=\"p\">...</span> <span class=\"k\">WHERE</span> blog<span class=\"p\">.</span>id <span class=\"k\">IN</span> <span class=\"p\">(</span><span class=\"k\">SELECT</span> id <span class=\"k\">FROM</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> NAME <span class=\"k\">LIKE</span> <span class=\"s1\">&#39;%Cheddar%&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你把一个由 <code class=\"docutils literal notranslate\">values()</code> 或 <code class=\"docutils literal notranslate\">values_list()</code> 产生的 <code class=\"docutils literal notranslate\">QuerySet</code> 作为值传递给 <code class=\"docutils literal notranslate\">__in</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>inner_qs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Ch&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\nentries <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__name__in<span class=\"o\">=</span>inner_qs<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=\"c1\"># Bad code! Will raise a TypeError.</span>\ninner_qs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Ch&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\nentries <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__name__in<span class=\"o\">=</span>inner_qs<span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition-null-values-and-three-valued-logic admonition\" id=\"null-and-three-valued-logic\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">NULL</code> values and three-valued logic</p>\n<p>When using a subquery (a <code class=\"docutils literal notranslate\">QuerySet</code>) on the right-hand side of an\n<code class=\"docutils literal notranslate\">__in</code> lookup, if the subquery returns any <code class=\"docutils literal notranslate\">NULL</code> values, it can\nproduce unexpected results due to SQL's three-valued logic.</p>\n<p>For example, when using <code class=\"docutils literal notranslate\">exclude(field__in=subquery)</code>, if the subquery\nreturns even a single <code class=\"docutils literal notranslate\">NULL</code> value, the SQL <code class=\"docutils literal notranslate\">NOT IN</code> comparison\nevaluates to <code class=\"docutils literal notranslate\">UNKNOWN</code> for all rows, resulting in an empty queryset.</p>\n<p>To avoid this, filter out <code class=\"docutils literal notranslate\">NULL</code> values from the subquery:</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>inner_qs <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__isnull<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span><span class=\"o\">.</span>values<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">)</span>\nentries <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>exclude<span class=\"p\">(</span>blog__in<span class=\"o\">=</span>inner_qs<span class=\"p\">)</span>\n</code></pre></div>\n<p>Alternatively, rewrite the query to use a NULL-safe\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#django.db.models.Exists\" title=\"django.db.models.Exists\"><code class=\"xref py py-class docutils literal notranslate\">Exists</code></a> subquery.</p>\n</aside>\n<aside class=\"admonition-performance-considerations admonition\" id=\"nested-queries-performance\" role=\"note\">\n<p class=\"admonition-title\">性能考量</p>\n<p>谨慎使用嵌套查询，了解你的数据库服务器的性能特点（如果有疑问，请做基准测试！）。一些数据库后端，最主要的是 MySQL，并不能很好地优化嵌套查询。在这些情况下，提取一个值的列表，然后将其传递到第二个查询中会更有效率。也就是说，执行两个查询而不是一个查询：</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>values <span class=\"o\">=</span> Blog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>name__contains<span class=\"o\">=</span><span class=\"s2\">&quot;Cheddar&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>values_list<span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> flat<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\nentries <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>blog__in<span class=\"o\">=</span><span class=\"nb\">list</span><span class=\"p\">(</span>values<span class=\"p\">))</span>\n</code></pre></div>\n<p>注意 Blog <code class=\"docutils literal notranslate\">QuerySet</code> 周围的 <code class=\"docutils literal notranslate\">list()</code> 调用，以强制执行第一个查询。如果没有它，一个嵌套查询就会被执行，因为 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#querysets-are-lazy\"><span class=\"std std-ref\">QuerySet 是惰性的</span></a>。</p>\n</aside>\n</section>\n<section id=\"gt\">\n<span id=\"std-fieldlookup-gt\"></span><h4><code class=\"docutils literal notranslate\">gt</code><a class=\"heading-anchor\" href=\"#gt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>大于。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>id__gt<span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> id <span class=\"o\">&gt;</span> <span class=\"mi\">4</span><span class=\"p\">;</span>\n</code></pre></div>\n</section>\n<section id=\"gte\">\n<span id=\"std-fieldlookup-gte\"></span><h4><code class=\"docutils literal notranslate\">gte</code><a class=\"heading-anchor\" href=\"#gte\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>大于等于。</p>\n</section>\n<section id=\"lt\">\n<span id=\"std-fieldlookup-lt\"></span><h4><code class=\"docutils literal notranslate\">lt</code><a class=\"heading-anchor\" href=\"#lt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>小于。</p>\n</section>\n<section id=\"lte\">\n<span id=\"std-fieldlookup-lte\"></span><h4><code class=\"docutils literal notranslate\">lte</code><a class=\"heading-anchor\" href=\"#lte\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>小于等于</p>\n</section>\n<section id=\"startswith\">\n<span id=\"std-fieldlookup-startswith\"></span><h4><code class=\"docutils literal notranslate\">startswith</code><a class=\"heading-anchor\" href=\"#startswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的开头为。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__startswith<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">LIKE</span> <span class=\"s1\">&#39;Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>SQLite 不支持区分大小写的 <code class=\"docutils literal notranslate\">LIKE</code> 语句；<code class=\"docutils literal notranslate\">startswith</code> 的作用就像 SQLite 的 <code class=\"docutils literal notranslate\">istartswith</code>。</p>\n</section>\n<section id=\"istartswith\">\n<span id=\"std-fieldlookup-istartswith\"></span><h4><code class=\"docutils literal notranslate\">istartswith</code><a class=\"heading-anchor\" href=\"#istartswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的开头为。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__istartswith<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<aside class=\"admonition-sqlite-users admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后端和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。</p>\n</aside>\n</section>\n<section id=\"endswith\">\n<span id=\"std-fieldlookup-endswith\"></span><h4><code class=\"docutils literal notranslate\">endswith</code><a class=\"heading-anchor\" href=\"#endswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的结尾为。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__endswith<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">LIKE</span> <span class=\"s1\">&#39;%Lennon&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<aside class=\"admonition-sqlite-users admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>SQLite 不支持区分大小写的 <code class=\"docutils literal notranslate\">LIKE</code> 语句；<code class=\"docutils literal notranslate\">endswith</code> 的作用类似于 SQLite 的 <code class=\"docutils literal notranslate\">iendswith</code>。更多内容请参考 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 文档。</p>\n</aside>\n</section>\n<section id=\"iendswith\">\n<span id=\"std-fieldlookup-iendswith\"></span><h4><code class=\"docutils literal notranslate\">iendswith</code><a class=\"heading-anchor\" href=\"#iendswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的结尾为。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>headline__iendswith<span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> headline <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%Lennon&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<aside class=\"admonition-sqlite-users admonition\" role=\"note\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后端和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。</p>\n</aside>\n</section>\n<section id=\"range\">\n<span id=\"std-fieldlookup-range\"></span><h4><code class=\"docutils literal notranslate\">range</code><a class=\"heading-anchor\" href=\"#range\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>范围测试（含）。</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=\"kn\">import</span> <span class=\"nn\">datetime</span>\n\nstart_date <span class=\"o\">=</span> datetime<span class=\"o\">.</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\nend_date <span class=\"o\">=</span> datetime<span class=\"o\">.</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">31</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__range<span class=\"o\">=</span><span class=\"p\">(</span>start_date<span class=\"p\">,</span> end_date<span class=\"p\">))</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> pub_date <span class=\"k\">BETWEEN</span> <span class=\"s1\">&#39;2005-01-01&#39;</span> <span class=\"k\">and</span> <span class=\"s1\">&#39;2005-03-31&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>在 SQL 中，你可以在任何你可以使用 <code class=\"docutils literal notranslate\">BETWEEN</code> 的地方使用 <code class=\"docutils literal notranslate\">range</code>——用于日期、数字甚至字符。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>用日期过滤 <code class=\"docutils literal notranslate\">DateTimeField</code> 不会包括最后一天的项目，因为界限被解释为“给定日期的 0 点”。如果 <code class=\"docutils literal notranslate\">pub_date</code> 是一个 <code class=\"docutils literal notranslate\">DateTimeField</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> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> pub_date <span class=\"k\">BETWEEN</span> <span class=\"s1\">&#39;2005-01-01 00:00:00&#39;</span> <span class=\"k\">and</span> <span class=\"s1\">&#39;2005-03-31 00:00:00&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>一般来说，你不能把日期和日期时间混在一起。</p>\n</aside>\n</section>\n<section id=\"date\">\n<span id=\"std-fieldlookup-date\"></span><h4><code class=\"docutils literal notranslate\">date</code><a class=\"heading-anchor\" href=\"#date\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间字段，将值投射为日期。允许链接其他字段的查找。取一个日期值。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__date<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__date__gt<span class=\"o\">=</span>datetime<span class=\"o\">.</span>date<span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，字段在过滤前会被转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"year\">\n<span id=\"std-fieldlookup-year\"></span><h4><code class=\"docutils literal notranslate\">year</code><a class=\"heading-anchor\" href=\"#year\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确匹配年份。允许链接其他字段的查询。取整数年。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__year__gte<span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> pub_date <span class=\"k\">BETWEEN</span> <span class=\"s1\">&#39;2005-01-01&#39;</span> <span class=\"k\">AND</span> <span class=\"s1\">&#39;2005-12-31&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> pub_date <span class=\"o\">&gt;=</span> <span class=\"s1\">&#39;2005-01-01&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"iso-year\">\n<span id=\"std-fieldlookup-iso_year\"></span><h4><code class=\"docutils literal notranslate\">iso_year</code><a class=\"heading-anchor\" href=\"#iso-year\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确的 ISO 8601 周号年份匹配。允许链接其他字段的查询。取整数年。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__iso_year<span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__iso_year__gte<span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"month\">\n<span id=\"std-fieldlookup-month\"></span><h4><code class=\"docutils literal notranslate\">month</code><a class=\"heading-anchor\" href=\"#month\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确的月份匹配。允许链接其他字段的查询。取整数 1（1 月）到 12（12 月）。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__month<span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__month__gte<span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;month&#39;</span> <span class=\"k\">FROM</span> pub_date<span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;12&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;month&#39;</span> <span class=\"k\">FROM</span> pub_date<span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"s1\">&#39;6&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"day\">\n<span id=\"std-fieldlookup-day\"></span><h4><code class=\"docutils literal notranslate\">day</code><a class=\"heading-anchor\" href=\"#day\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确匹配日期。允许链接其他字段的查询。取整数日。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__day<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__day__gte<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;day&#39;</span> <span class=\"k\">FROM</span> pub_date<span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;3&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;day&#39;</span> <span class=\"k\">FROM</span> pub_date<span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"s1\">&#39;3&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>请注意，这将匹配任何带有 pub_date 的月份第三天的记录，如 1 月 3 日，7 月 3 日等。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"week\">\n<span id=\"std-fieldlookup-week\"></span><h4><code class=\"docutils literal notranslate\">week</code><a class=\"heading-anchor\" href=\"#week\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，根据 <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/ISO-8601\">ISO-8601</a> ，返回星期号（1-52 或 53），即星期从星期一开始，第一周包含一年的第一个星期四。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__week<span class=\"o\">=</span><span class=\"mi\">52</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__week__gte<span class=\"o\">=</span><span class=\"mi\">32</span><span class=\"p\">,</span> pub_date__week__lte<span class=\"o\">=</span><span class=\"mi\">38</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"week-day\">\n<span id=\"std-fieldlookup-week_day\"></span><h4><code class=\"docutils literal notranslate\">week_day</code><a class=\"heading-anchor\" href=\"#week-day\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，“星期几”匹配。允许链接其他字段的查询。</p>\n<p>从 1（星期日）到 7（星期六）取一个整数值，代表一周的一天。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__week_day<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__week_day__gte<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>请注意，这将匹配任何带有 <code class=\"docutils literal notranslate\">pub_date</code> 的记录，这些记录都是在星期一（一周的第 2 天）发生的，不管它发生在哪一年哪一月。周日的索引，第 1 天是周日，第 7 天是周六。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"iso-week-day\">\n<span id=\"std-fieldlookup-iso_week_day\"></span><h4><code class=\"docutils literal notranslate\">iso_week_day</code><a class=\"heading-anchor\" href=\"#iso-week-day\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确匹配 ISO 8601 星期几。允许链接其他字段的查询。</p>\n<p>取一个整数值，代表一周的 1（星期一）到 7（星期日）。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__iso_week_day<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__iso_week_day__gte<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>请注意，这将匹配任何带有 <code class=\"docutils literal notranslate\">pub_date</code> 的记录，这些记录都是在星期一（一周的第 1 天）发生的，不管它发生在哪个月或哪个年。周日的索引是第 1 天是星期一，第 7 天是星期天。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"quarter\">\n<span id=\"std-fieldlookup-quarter\"></span><h4><code class=\"docutils literal notranslate\">quarter</code><a class=\"heading-anchor\" href=\"#quarter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，“一年的四分之一”匹配。允许链接额外的字段查找。取 1 到 4 之间的整数值，代表一年中的季度。</p>\n<p>检索第二季度（4 月 1 日至 6 月 30 日）的条目示例：</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__quarter<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"time\">\n<span id=\"std-fieldlookup-time\"></span><h4><code class=\"docutils literal notranslate\">time</code><a class=\"heading-anchor\" href=\"#time\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间字段，将其值强制转换为时间。允许链式附加字段查找。取一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.time\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime.time</code></a> 的值。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__time<span class=\"o\">=</span>datetime<span class=\"o\">.</span>time<span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"mi\">30</span><span class=\"p\">))</span>\nEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__time__range<span class=\"o\">=</span><span class=\"p\">(</span>datetime<span class=\"o\">.</span>time<span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">),</span> datetime<span class=\"o\">.</span>time<span class=\"p\">(</span><span class=\"mi\">17</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，字段在过滤前会被转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"hour\">\n<span id=\"std-fieldlookup-hour\"></span><h4><code class=\"docutils literal notranslate\">hour</code><a class=\"heading-anchor\" href=\"#hour\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间和时间字段，精确的小时匹配。允许链式查找其他字段。取 0 到 23 之间的整数。</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>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>timestamp__hour<span class=\"o\">=</span><span class=\"mi\">23</span><span class=\"p\">)</span>\nEvent<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>time__hour<span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\nEvent<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>timestamp__hour__gte<span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">timestamp</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;23&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">time</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;5&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">timestamp</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"s1\">&#39;12&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"minute\">\n<span id=\"std-fieldlookup-minute\"></span><h4><code class=\"docutils literal notranslate\">minute</code><a class=\"heading-anchor\" href=\"#minute\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间和时间字段，精确的分钟匹配。允许链式查找其他字段。取 0 到 59 之间的整数。</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>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>timestamp__minute<span class=\"o\">=</span><span class=\"mi\">29</span><span class=\"p\">)</span>\nEvent<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>time__minute<span class=\"o\">=</span><span class=\"mi\">46</span><span class=\"p\">)</span>\nEvent<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>timestamp__minute__gte<span class=\"o\">=</span><span class=\"mi\">29</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">timestamp</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;29&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">time</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;46&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">timestamp</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"s1\">&#39;29&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"second\">\n<span id=\"std-fieldlookup-second\"></span><h4><code class=\"docutils literal notranslate\">second</code><a class=\"heading-anchor\" href=\"#second\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间和时间字段，完全秒配。允许链式查找其他字段。取 0 到 59 之间的整数。</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>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>timestamp__second<span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">)</span>\nEvent<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>time__second<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\nEvent<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>timestamp__second__gte<span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">timestamp</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;31&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">time</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;2&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span> <span class=\"k\">FROM</span> <span class=\"k\">timestamp</span><span class=\"p\">)</span> <span class=\"o\">&gt;=</span> <span class=\"s1\">&#39;31&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> 为 <code class=\"docutils literal notranslate\">True</code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"isnull\">\n<span id=\"std-fieldlookup-isnull\"></span><h4><code class=\"docutils literal notranslate\">isnull</code><a class=\"heading-anchor\" href=\"#isnull\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>取 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code>，分别对应 <code class=\"docutils literal notranslate\">IS NULL</code> 和 <code class=\"docutils literal notranslate\">IS NOT NULL</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>pub_date__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> pub_date <span class=\"k\">IS</span> <span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n</section>\n<section id=\"regex\">\n<span id=\"std-fieldlookup-regex\"></span><h4><code class=\"docutils literal notranslate\">regex</code><a class=\"heading-anchor\" href=\"#regex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的正则表达式匹配。</p>\n<p>正则表达式语法是使用中的数据库后端的语法。对于没有内置正则表达式支持的 SQLite 来说，这个功能是由（Python）用户定义的 REGEXP 函数提供的，因此正则表达式语法是 Python 的 <code class=\"docutils literal notranslate\">re</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>title__regex<span class=\"o\">=</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^(An?|The) +&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> title REGEXP <span class=\"nb\">BINARY</span> <span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span> <span class=\"c1\">-- MySQL</span>\n\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> REGEXP_LIKE<span class=\"p\">(</span>title<span class=\"p\">,</span> <span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;c&#39;</span><span class=\"p\">);</span> <span class=\"c1\">-- Oracle</span>\n\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> title <span class=\"o\">~</span> <span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span> <span class=\"c1\">-- PostgreSQL</span>\n\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> title REGEXP <span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span> <span class=\"c1\">-- SQLite</span>\n</code></pre></div>\n<p>建议使用原始字符串（例如，用 <code class=\"docutils literal notranslate\">r'foo'</code> 代替 <code class=\"docutils literal notranslate\">'foo'</code>）来传递正则表达式语法。</p>\n</section>\n<section id=\"iregex\">\n<span id=\"std-fieldlookup-iregex\"></span><h4><code class=\"docutils literal notranslate\">iregex</code><a class=\"heading-anchor\" href=\"#iregex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的正则表达式匹配。</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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>title__iregex<span class=\"o\">=</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^(an?|the) +&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\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=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> title REGEXP <span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">;</span> <span class=\"c1\">-- MySQL</span>\n\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> REGEXP_LIKE<span class=\"p\">(</span>title<span class=\"p\">,</span> <span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;i&#39;</span><span class=\"p\">);</span> <span class=\"c1\">-- Oracle</span>\n\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> title <span class=\"o\">~*</span> <span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">;</span> <span class=\"c1\">-- PostgreSQL</span>\n\n<span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> title REGEXP <span class=\"s1\">&#39;(?i)^(an?|the) +&#39;</span><span class=\"p\">;</span> <span class=\"c1\">-- SQLite</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"aggregation-functions\">\n<span id=\"id6\"></span><h3>聚合函数<a class=\"heading-anchor\" href=\"#aggregation-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 在 <code class=\"docutils literal notranslate\">django.db.models</code> 模块中提供了以下聚合函数。关于如何使用这些聚合函数的细节，请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/aggregation/\"><span class=\"doc\">关于聚合的主题指南</span></a>。参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#django.db.models.Aggregate\" title=\"django.db.models.Aggregate\"><code class=\"xref py py-class docutils literal notranslate\">Aggregate</code></a> 文档，了解如何创建你的聚合函数。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>SQLite 无法处理日期／时间字段的聚合。这是因为 SQLite 中没有原生的日期／时间字段，而 Django 目前使用文本字段来模拟这些功能。试图在 SQLite 中使用日期／时间字段上的聚合将引发 <code class=\"docutils literal notranslate\">NotSupportedError</code>。</p>\n</aside>\n<aside class=\"admonition-empty-querysets-or-groups admonition\" role=\"note\">\n<p class=\"admonition-title\">空的查询集或分组</p>\n<p>聚合函数在与空的 <code class=\"docutils literal notranslate\">QuerySet</code> 或分组一起使用时会返回 <code class=\"docutils literal notranslate\">None</code>。例如，如果 <code class=\"docutils literal notranslate\">QuerySet</code> 不包含任何条目或在非空的 <code class=\"docutils literal notranslate\">QuerySet</code> 中有任何空分组时，<code class=\"docutils literal notranslate\">Sum</code> 聚合函数将返回 <code class=\"docutils literal notranslate\">None</code> 而不是 <code class=\"docutils literal notranslate\">0</code>。要返回另一个值，可以定义 <code class=\"docutils literal notranslate\">default</code> 参数。 <code class=\"docutils literal notranslate\">Count</code> 是这种行为的一个例外；如果 <code class=\"docutils literal notranslate\">QuerySet</code> 为空，它将返回 <code class=\"docutils literal notranslate\">0</code>，因为 <code class=\"docutils literal notranslate\">Count</code> 不支持 <code class=\"docutils literal notranslate\">default</code> 参数。</p>\n</aside>\n<p>所有聚合体都有以下共同的参数：</p>\n<section id=\"expressions\">\n<h4><code class=\"docutils literal notranslate\">expressions</code><a class=\"heading-anchor\" href=\"#expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>引用模型上的字段的字符串，字段的转换，或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a>。</p>\n</section>\n<section id=\"output-field\">\n<h4><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></h4>\n<p>一个可选的参数，表示返回值的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/\"><span class=\"doc\">模型字段</span></a></p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当组合多个字段类型时，Django 只能在所有字段类型相同的情况下确定 <code class=\"docutils literal notranslate\">output_field</code>。否则，你必须自己提供 <code class=\"docutils literal notranslate\">output_field</code>。</p>\n</aside>\n</section>\n<section id=\"aggregate-filter\">\n<span id=\"id7\"></span><h4><code class=\"docutils literal notranslate\">filter</code><a class=\"heading-anchor\" href=\"#aggregate-filter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>An optional <a class=\"reference internal\" href=\"#q-objects\"><span class=\"std std-ref\">Q object</span></a> that's used to filter the rows that\nare aggregated.</p>\n<p>参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/conditional-expressions/#conditional-aggregation\"><span class=\"std std-ref\">条件聚合</span></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/aggregation/#filtering-on-annotations\"><span class=\"std std-ref\">过滤注解</span></a> 的用法示例。</p>\n</section>\n<section id=\"default\">\n<span id=\"aggregate-default\"></span><h4><code class=\"docutils literal notranslate\">default</code><a class=\"heading-anchor\" href=\"#default\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>一个可选的参数，允许指定一个值作为默认值，当查询集（或分组）不包含条目时使用。</p>\n</section>\n<section id=\"id8\">\n<h4><code class=\"docutils literal notranslate\">**extra</code><a class=\"heading-anchor\" href=\"#id8\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>关键字参数，可以为聚合生成的 SQL 提供额外的上下文。</p>\n</section>\n<section id=\"anyvalue\">\n<h4><code class=\"docutils literal notranslate\">AnyValue</code><a class=\"heading-anchor\" href=\"#anyvalue\"><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=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.AnyValue\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">AnyValue</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</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.AnyValue\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns an arbitrary value from the non-null input values.</p>\n<ul class=\"simple\">\n<li><p>Default alias: <code class=\"docutils literal notranslate\">&lt;field&gt;__anyvalue</code></p></li>\n<li><p>返回类型：与输入字段相同，或者如果提供了 <code class=\"docutils literal notranslate\">output_field</code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\">default</code>。</p></li>\n</ul>\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=\"c1\"># Get average rating for each year along with a sample headline</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># from that year.</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> AnyValue<span class=\"p\">,</span> Avg<span class=\"p\">,</span> F<span class=\"p\">,</span> Q\n<span class=\"gp\">&gt;&gt;&gt; </span>sample_headline <span class=\"o\">=</span> AnyValue<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    pub_year<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date__year&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<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>    sample_headline<span class=\"o\">=</span>sample_headline<span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get a sample headline from each year with rating greater than 4.5.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>sample_headline <span class=\"o\">=</span> AnyValue<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">filter</span><span class=\"o\">=</span>Q<span class=\"p\">(</span>rating__gt<span class=\"o\">=</span><span class=\"mf\">4.5</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>values<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    pub_year<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;pub_date__year&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    avg_rating<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>    sample_headline<span class=\"o\">=</span>sample_headline<span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Supported on SQLite, MySQL, Oracle, and PostgreSQL 16+.</p>\n<aside class=\"admonition-mysql-with-only-full-group-by-enabled admonition\" role=\"note\">\n<p class=\"admonition-title\">MySQL with <code class=\"docutils literal notranslate\">ONLY_FULL_GROUP_BY</code> enabled</p>\n<p>When the <code class=\"docutils literal notranslate\">ONLY_FULL_GROUP_BY</code> SQL mode is enabled on MySQL it may be\nnecessary to use <code class=\"docutils literal notranslate\">AnyValue</code> if an aggregation includes a mix of\naggregate and non-aggregate functions. Using <code class=\"docutils literal notranslate\">AnyValue</code> allows the\nnon-aggregate function to be referenced in the select list when\ndatabase cannot determine that it is functionally dependent on the\ncolumns in the <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/8.4/en/group-by-handling.html\">group by</a> clause. See the <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/aggregation/#aggregation-mysql-only-full-group-by\"><span class=\"std std-ref\">aggregation\ndocumentation</span></a> for more details.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"avg\">\n<h4><code class=\"docutils literal notranslate\">Avg</code><a class=\"heading-anchor\" href=\"#avg\"><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.Avg\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Avg</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</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.Avg\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式的平均值，除非指定不同的 <code class=\"docutils literal notranslate\">output_field</code>，否则必须是数值。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\">&lt;field&gt;__avg</code></p></li>\n<li><p>返回类型：如果输入是 <code class=\"docutils literal notranslate\">int</code>，则返回 <code class=\"docutils literal notranslate\">float</code>，否则返回与输入字段相同的类型，或者如果提供了 <code class=\"docutils literal notranslate\">output_field</code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\">default</code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Avg.distinct\">\n<span class=\"sig-name descname\">distinct</span><a class=\"heading-anchor\" href=\"#django.db.models.Avg.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=True</code>，则 <code class=\"docutils literal notranslate\">Avg</code> 返回唯一值的平均值。这相当于 SQL 中的 <code class=\"docutils literal notranslate\">AVG(DISTINCT &lt;field&gt;)</code>。默认值是 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"bitand\">\n<h4><code class=\"docutils literal notranslate\">BitAnd</code><a class=\"heading-anchor\" href=\"#bitand\"><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.BitAnd\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BitAnd</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</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.BitAnd\"><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=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>返回所有非空输入值的位式 <code class=\"docutils literal notranslate\">AND</code> 的 <code class=\"docutils literal notranslate\">int</code>，如果所有值为空，则返回 <code class=\"docutils literal notranslate\">default</code>。</p>\n<p>The <code class=\"docutils literal notranslate\">default</code> parameter is not supported on MariaDB, MySQL, and Oracle.</p>\n</dd></dl>\n\n</section>\n<section id=\"bitor\">\n<h4><code class=\"docutils literal notranslate\">BitOr</code><a class=\"heading-anchor\" href=\"#bitor\"><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.BitOr\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BitOr</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</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.BitOr\"><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=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>返回所有非空输入值的位式 <code class=\"docutils literal notranslate\">OR</code> 的 <code class=\"docutils literal notranslate\">int</code>，如果所有值为空，则返回 <code class=\"docutils literal notranslate\">default</code>。</p>\n<p>The <code class=\"docutils literal notranslate\">default</code> parameter is not supported on MariaDB, MySQL, and Oracle.</p>\n</dd></dl>\n\n</section>\n<section id=\"bitxor\">\n<h4><code class=\"docutils literal notranslate\">BitXor</code><a class=\"heading-anchor\" href=\"#bitxor\"><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.BitXor\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BitXor</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</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.BitXor\"><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=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>Returns an <code class=\"docutils literal notranslate\">int</code> of the bitwise <code class=\"docutils literal notranslate\">XOR</code> of all non-null input values, or\n<code class=\"docutils literal notranslate\">default</code> if all values are null.</p>\n<p>The <code class=\"docutils literal notranslate\">default</code> parameter is not supported on MariaDB, MySQL, and Oracle.</p>\n</dd></dl>\n\n</section>\n<section id=\"id9\">\n<h4><code class=\"docutils literal notranslate\">Count</code><a class=\"heading-anchor\" href=\"#id9\"><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.Count\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Count</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</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\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Count\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回通过提供的表达式相关联的对象数量。 <code class=\"docutils literal notranslate\">Count('*')</code> 等同于 SQL 的 <code class=\"docutils literal notranslate\">COUNT(*)</code> 表达式。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\">&lt;field&gt;__count</code></p></li>\n<li><p>返回类型：<code class=\"docutils literal notranslate\">int</code></p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Count.distinct\">\n<span class=\"sig-name descname\">distinct</span><a class=\"heading-anchor\" href=\"#django.db.models.Count.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=True</code>，计数将仅包括唯一的实例。这相当于 SQL 中的 <code class=\"docutils literal notranslate\">COUNT(DISTINCT &lt;field&gt;)</code>。默认值是 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>不支持 <code class=\"docutils literal notranslate\">default</code> 参数。</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"max\">\n<h4><code class=\"docutils literal notranslate\">Max</code><a class=\"heading-anchor\" href=\"#max\"><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.Max\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Max</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</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.Max\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式的最大值。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\">&lt;field&gt;__max</code></p></li>\n<li><p>返回类型：与输入字段相同，或者如果提供了 <code class=\"docutils literal notranslate\">output_field</code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\">default</code>。</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"min\">\n<h4><code class=\"docutils literal notranslate\">Min</code><a class=\"heading-anchor\" href=\"#min\"><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.Min\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Min</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</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.Min\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式的最小值。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\">&lt;field&gt;__min</code></p></li>\n<li><p>返回类型：与输入字段相同，或者如果提供了 <code class=\"docutils literal notranslate\">output_field</code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\">default</code>。</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"stddev\">\n<h4><code class=\"docutils literal notranslate\">StdDev</code><a class=\"heading-anchor\" href=\"#stddev\"><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.StdDev\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">StdDev</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">sample<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.StdDev\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式中数据的标准差。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\">&lt;field&gt;__stddev</code></p></li>\n<li><p>返回类型：如果输入是 <code class=\"docutils literal notranslate\">int</code>，则返回 <code class=\"docutils literal notranslate\">float</code>，否则返回与输入字段相同的类型，或者如果提供了 <code class=\"docutils literal notranslate\">output_field</code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\">default</code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.StdDev.sample\">\n<span class=\"sig-name descname\">sample</span><a class=\"heading-anchor\" href=\"#django.db.models.StdDev.sample\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。默认情况下，<code class=\"docutils literal notranslate\">StdDev</code> 返回总体标准差。然而，如果 <code class=\"docutils literal notranslate\">sample=True</code>，返回值将是样本标准差。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"sum\">\n<h4><code class=\"docutils literal notranslate\">Sum</code><a class=\"heading-anchor\" href=\"#sum\"><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.Sum\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Sum</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</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.Sum\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>计算给定表达式的所有值的总和。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\">&lt;field&gt;__sum</code></p></li>\n<li><p>返回类型：与输入字段相同，或者如果提供了 <code class=\"docutils literal notranslate\">output_field</code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\">default</code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Sum.distinct\">\n<span class=\"sig-name descname\">distinct</span><a class=\"heading-anchor\" href=\"#django.db.models.Sum.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=True</code>，<code class=\"docutils literal notranslate\">Sum</code> 返回唯一值的总和。这相当于 SQL 中的 <code class=\"docutils literal notranslate\">SUM(DISTINCT &lt;field&gt;)</code>。默认值是 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"variance\">\n<h4><code class=\"docutils literal notranslate\">Variance</code><a class=\"heading-anchor\" href=\"#variance\"><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.Variance\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Variance</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">sample<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.Variance\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式中数据的方差。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\">&lt;field&gt;__variance</code></p></li>\n<li><p>返回类型：如果输入是 <code class=\"docutils literal notranslate\">int</code>，则返回 <code class=\"docutils literal notranslate\">float</code>，否则返回与输入字段相同的类型，或者如果提供了 <code class=\"docutils literal notranslate\">output_field</code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\">default</code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Variance.sample\">\n<span class=\"sig-name descname\">sample</span><a class=\"heading-anchor\" href=\"#django.db.models.Variance.sample\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。默认情况下，<code class=\"docutils literal notranslate\">Variance</code> 返回总体方差。然而，如果 <code class=\"docutils literal notranslate\">sample=True</code>，返回值将是样本方差。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"stringagg\">\n<h4><code class=\"docutils literal notranslate\">StringAgg</code><a class=\"heading-anchor\" href=\"#stringagg\"><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=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.StringAgg\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">StringAgg</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">delimiter</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\">order_by<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.StringAgg\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回输入值串联成的字符串，用 <code class=\"docutils literal notranslate\">delimiter</code> 字符串分隔，如果没有值，则返回 <code class=\"docutils literal notranslate\">default</code>。</p>\n<ul class=\"simple\">\n<li><p>Default alias: <code class=\"docutils literal notranslate\">&lt;field&gt;__stringagg</code></p></li>\n<li><p>Return type: <code class=\"docutils literal notranslate\">string</code> or <code class=\"docutils literal notranslate\">output_field</code> if supplied. If the\nqueryset or grouping is empty, <code class=\"docutils literal notranslate\">default</code> is returned.</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.StringAgg.delimiter\">\n<span class=\"sig-name descname\">delimiter</span><a class=\"heading-anchor\" href=\"#django.db.models.StringAgg.delimiter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A <code class=\"docutils literal notranslate\">Value</code> or expression representing the string that should separate\neach of the values. For example, <code class=\"docutils literal notranslate\">Value(&quot;,&quot;)</code>. (On SQLite, the\nliteral delimiter <code class=\"docutils literal notranslate\">Value(&quot;,&quot;)</code> is the only delimiter compatible with\n<code class=\"docutils literal notranslate\">distinct=True</code>.)</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>Support for using <code class=\"docutils literal notranslate\">distinct=True</code> with a delimiter of\n<code class=\"docutils literal notranslate\">Value(&quot;,&quot;)</code> on SQLite was added.</p>\n</aside>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n</section>\n</section>\n<section id=\"query-related-tools\">\n<h2>查询相关工具<a class=\"heading-anchor\" href=\"#query-related-tools\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>本节提供了与查询相关的工具的参考资料，其他地方没有记载。</p>\n<section id=\"q-objects\">\n<span id=\"id10\"></span><h3><code class=\"docutils literal notranslate\">Q()</code> 对象<a class=\"heading-anchor\" href=\"#q-objects\"><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.Q\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Q</span><a class=\"heading-anchor\" href=\"#django.db.models.Q\"><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\">Q()</code> 对象表示可用于数据库相关操作的 SQL 条件。 它类似于 F() &lt;django.db.models.F&gt;` 对象表示模型字段或注释的值的方式。 它们使得定义和重用条件成为可能。 这些可以使用“~”（“NOT”）运算符进行否定，并使用“|”（“OR”）、“&amp;”（“AND”）等运算符进行组合 ) 和``^`` (<code class=\"docutils literal notranslate\">XOR</code>)。 请参阅：ref:complex-lookups-with-q。</p>\n</section>\n<section id=\"prefetch-objects\">\n<h3><code class=\"docutils literal notranslate\">Prefetch()</code> 对象<a class=\"heading-anchor\" href=\"#prefetch-objects\"><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.Prefetch\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Prefetch</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">lookup</em>, <em class=\"sig-param\">queryset<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">to_attr<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Prefetch\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>The <code class=\"docutils literal notranslate\">Prefetch()</code> object can be used to control the operation of\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\">prefetch_related()</code></a>.</p>\n<p>The <code class=\"docutils literal notranslate\">lookup</code> argument describes the relations to follow and works the same\nas the string based lookups passed to\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\">prefetch_related()</code></a>. For example:</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> Prefetch\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;choice_set&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span>get<span class=\"p\">()</span><span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n<span class=\"go\"># This will only execute two queries regardless of the number of Question</span>\n<span class=\"go\"># and Choice objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;choice_set&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\">queryset</code> argument supplies a base <code class=\"docutils literal notranslate\">QuerySet</code> for the given lookup.\nThis is useful to further filter down the prefetch operation, or to call\n<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> from the prefetched\nrelation, hence reducing the number of queries even further:</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>voted_choices <span class=\"o\">=</span> Choice<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>votes__gt<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>voted_choices\n<span class=\"go\">&lt;QuerySet [&lt;Choice: The sky&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>prefetch <span class=\"o\">=</span> Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;choice_set&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>voted_choices<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>prefetch<span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">()</span><span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: The sky&gt;]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">to_attr</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>prefetch <span class=\"o\">=</span> Prefetch<span class=\"p\">(</span><span class=\"s2\">&quot;choice_set&quot;</span><span class=\"p\">,</span> queryset<span class=\"o\">=</span>voted_choices<span class=\"p\">,</span> to_attr<span class=\"o\">=</span><span class=\"s2\">&quot;voted_choices&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>prefetch<span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">()</span><span class=\"o\">.</span>voted_choices\n<span class=\"go\">[&lt;Choice: The sky&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>prefetch_related<span class=\"p\">(</span>prefetch<span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">()</span><span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当使用 <code class=\"docutils literal notranslate\">to_attr</code> 时，预取结果存储在列表中。 与传统的 <code class=\"docutils literal notranslate\">prefetch_related</code> 调用相比，这可以显着提高速度，传统的 <code class=\"docutils literal notranslate\">prefetch_related</code> 调用将缓存的结果存储在 <code class=\"docutils literal notranslate\">QuerySet</code> 实例中。</p>\n</aside>\n</section>\n<section id=\"prefetch-related-objects\">\n<h3><code class=\"docutils literal notranslate\">prefetch_related_objects()</code><a class=\"heading-anchor\" href=\"#prefetch-related-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.prefetch_related_objects\">\n<span class=\"sig-name descname\">prefetch_related_objects</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model_instances</em>, <em class=\"sig-param\"><span class=\"o\">*</span>related_lookups</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.prefetch_related_objects\"><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 function\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.aprefetch_related_objects\">\n<span class=\"sig-name descname\">aprefetch_related_objects</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model_instances</em>, <em class=\"sig-param\"><span class=\"o\">*</span>related_lookups</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.aprefetch_related_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>：<code class=\"docutils literal notranslate\">aprefetch_related_objects()</code></p>\n<p>在作为模型实例的可迭代对象上预取给定的查找。这在接收模型实例列表而不是 <code class=\"docutils literal notranslate\">QuerySet</code> 的代码中很有用；例如，从缓存中获取模型或手动实例化它们时。</p>\n<p>Pass an iterable of model instances (must all be of the same class and able to\nbe iterated multiple times) and the lookups or <a class=\"reference internal\" href=\"#django.db.models.Prefetch\" title=\"django.db.models.Prefetch\"><code class=\"xref py py-class docutils literal notranslate\">Prefetch</code></a> objects you\nwant to prefetch for. For example:</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> prefetch_related_objects\n<span class=\"gp\">&gt;&gt;&gt; </span>restaurants <span class=\"o\">=</span> fetch_top_restaurants_from_cache<span class=\"p\">()</span>  <span class=\"c1\"># A list of Restaurants</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>prefetch_related_objects<span class=\"p\">(</span>restaurants<span class=\"p\">,</span> <span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>当使用 <code class=\"docutils literal notranslate\">prefetch_related_objects</code> 的多个数据库时，预取查询将使用与模型实例相关的数据库。这可以通过在相关查找中使用自定义查询集来覆盖。</p>\n</section>\n<section id=\"filteredrelation-objects\">\n<h3><code class=\"docutils literal notranslate\">FilteredRelation()</code> 对象<a class=\"heading-anchor\" href=\"#filteredrelation-objects\"><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.FilteredRelation\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">FilteredRelation</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">relation_name</em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">condition<span class=\"o\">=</span><span class=\"default_value\">Q()</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation\"><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.FilteredRelation.relation_name\">\n<span class=\"sig-name descname\">relation_name</span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation.relation_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>你想过滤关系的字段名。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FilteredRelation.condition\">\n<span class=\"sig-name descname\">condition</span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation.condition\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A <a class=\"reference internal\" href=\"#q-objects\"><span class=\"std std-ref\">Q object</span></a> to control the filtering.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">FilteredRelation</code> is used with <a class=\"reference internal\" href=\"#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> to create an\n<code class=\"docutils literal notranslate\">ON</code> clause when a <code class=\"docutils literal notranslate\">JOIN</code> is performed. It doesn't act on the default\nrelationship but on the annotation name (<code class=\"docutils literal notranslate\">pizzas_vegetarian</code> in example\nbelow).</p>\n<p>例如，要查找具有在名称中包含 <code class=\"docutils literal notranslate\">'mozzarella'</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> FilteredRelation<span class=\"p\">,</span> Q\n<span class=\"gp\">&gt;&gt;&gt; </span>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    pizzas_vegetarian<span class=\"o\">=</span>FilteredRelation<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        condition<span class=\"o\">=</span>Q<span class=\"p\">(</span>pizzas__vegetarian<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>pizzas_vegetarian__name__icontains<span class=\"o\">=</span><span class=\"s2\">&quot;mozzarella&quot;</span><span class=\"p\">)</span>\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>Restaurant<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    pizzas__vegetarian<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    pizzas__name__icontains<span class=\"o\">=</span><span class=\"s2\">&quot;mozzarella&quot;</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\">WHERE</code> 子句中的过滤只对素食披萨进行操作。</p>\n<p><code class=\"docutils literal notranslate\">FilteredRelation</code> 不支持：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.only()</code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\">prefetch_related()</code></a>。</p></li>\n<li><p>一个从父模型继承的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">GenericForeignKey</code></a>。</p></li>\n</ul>\n</section>\n</section>","rootId":"queryset-api-reference","toc":[{"title":"什么时候 QuerySet 被执行","anchor":"when-querysets-are-evaluated","children":[{"title":"Pickle 序列化 QuerySet","anchor":"pickling-querysets","children":[]}]},{"title":"QuerySet API","anchor":"queryset-api","children":[{"title":"返回新 QuerySet 的方法","anchor":"methods-that-return-new-querysets","children":[{"title":"filter()","anchor":"filter","children":[]},{"title":"exclude()","anchor":"exclude","children":[]},{"title":"annotate()","anchor":"annotate","children":[]},{"title":"alias()","anchor":"alias","children":[]},{"title":"order_by()","anchor":"order-by","children":[]},{"title":"reverse()","anchor":"reverse","children":[]},{"title":"distinct()","anchor":"distinct","children":[]},{"title":"values()","anchor":"values","children":[]},{"title":"values_list()","anchor":"values-list","children":[]},{"title":"dates()","anchor":"dates","children":[]},{"title":"datetimes()","anchor":"datetimes","children":[]},{"title":"none()","anchor":"none","children":[]},{"title":"all()","anchor":"all","children":[]},{"title":"union()","anchor":"union","children":[]},{"title":"intersection()","anchor":"intersection","children":[]},{"title":"difference()","anchor":"difference","children":[]},{"title":"fetch_mode()","anchor":"fetch-mode","children":[]},{"title":"select_related()","anchor":"select-related","children":[]},{"title":"prefetch_related()","anchor":"prefetch-related","children":[]},{"title":"extra()","anchor":"extra","children":[]},{"title":"defer()","anchor":"defer","children":[]},{"title":"only()","anchor":"only","children":[]},{"title":"using()","anchor":"using","children":[]},{"title":"select_for_update()","anchor":"select-for-update","children":[]},{"title":"raw()","anchor":"raw","children":[]}]},{"title":"返回新 QuerySet 的操作符","anchor":"operators-that-return-new-querysets","children":[{"title":"AND（&）","anchor":"and","children":[]},{"title":"OR（|）","anchor":"or","children":[]},{"title":"XOR (^)","anchor":"xor","children":[]}]},{"title":"不返回 QuerySet 的方法","anchor":"methods-that-do-not-return-querysets","children":[{"title":"get()","anchor":"get","children":[]},{"title":"create()","anchor":"create","children":[]},{"title":"get_or_create()","anchor":"get-or-create","children":[]},{"title":"update_or_create()","anchor":"update-or-create","children":[]},{"title":"bulk_create()","anchor":"bulk-create","children":[]},{"title":"bulk_update()","anchor":"bulk-update","children":[]},{"title":"count()","anchor":"count","children":[]},{"title":"in_bulk()","anchor":"in-bulk","children":[]},{"title":"iterator()","anchor":"iterator","children":[{"title":"使用服务器端游标","anchor":"with-server-side-cursors","children":[]},{"title":"没有服务器端游标","anchor":"without-server-side-cursors","children":[]}]},{"title":"latest()","anchor":"latest","children":[]},{"title":"earliest()","anchor":"earliest","children":[]},{"title":"first()","anchor":"first","children":[]},{"title":"last()","anchor":"last","children":[]},{"title":"aggregate()","anchor":"aggregate","children":[]},{"title":"exists()","anchor":"exists","children":[]},{"title":"contains()","anchor":"contains","children":[]},{"title":"update()","anchor":"update","children":[{"title":"有序的查询集","anchor":"ordered-queryset","children":[]}]},{"title":"delete()","anchor":"delete","children":[]},{"title":"as_manager()","anchor":"as-manager","children":[]},{"title":"explain()","anchor":"explain","children":[]}]},{"title":"Field 查找","anchor":"field-lookups","children":[{"title":"exact","anchor":"exact","children":[]},{"title":"iexact","anchor":"iexact","children":[]},{"title":"contains","anchor":"std-fieldlookup-contains","children":[]},{"title":"icontains","anchor":"icontains","children":[]},{"title":"in","anchor":"in","children":[]},{"title":"gt","anchor":"gt","children":[]},{"title":"gte","anchor":"gte","children":[]},{"title":"lt","anchor":"lt","children":[]},{"title":"lte","anchor":"lte","children":[]},{"title":"startswith","anchor":"startswith","children":[]},{"title":"istartswith","anchor":"istartswith","children":[]},{"title":"endswith","anchor":"endswith","children":[]},{"title":"iendswith","anchor":"iendswith","children":[]},{"title":"range","anchor":"range","children":[]},{"title":"date","anchor":"date","children":[]},{"title":"year","anchor":"year","children":[]},{"title":"iso_year","anchor":"iso-year","children":[]},{"title":"month","anchor":"month","children":[]},{"title":"day","anchor":"day","children":[]},{"title":"week","anchor":"week","children":[]},{"title":"week_day","anchor":"week-day","children":[]},{"title":"iso_week_day","anchor":"iso-week-day","children":[]},{"title":"quarter","anchor":"quarter","children":[]},{"title":"time","anchor":"time","children":[]},{"title":"hour","anchor":"hour","children":[]},{"title":"minute","anchor":"minute","children":[]},{"title":"second","anchor":"second","children":[]},{"title":"isnull","anchor":"isnull","children":[]},{"title":"regex","anchor":"regex","children":[]},{"title":"iregex","anchor":"iregex","children":[]}]},{"title":"聚合函数","anchor":"aggregation-functions","children":[{"title":"expressions","anchor":"expressions","children":[]},{"title":"output_field","anchor":"output-field","children":[]},{"title":"filter","anchor":"aggregate-filter","children":[]},{"title":"default","anchor":"default","children":[]},{"title":"**extra","anchor":"id8","children":[]},{"title":"AnyValue","anchor":"anyvalue","children":[]},{"title":"Avg","anchor":"avg","children":[]},{"title":"BitAnd","anchor":"bitand","children":[]},{"title":"BitOr","anchor":"bitor","children":[]},{"title":"BitXor","anchor":"bitxor","children":[]},{"title":"Count","anchor":"id9","children":[]},{"title":"Max","anchor":"max","children":[]},{"title":"Min","anchor":"min","children":[]},{"title":"StdDev","anchor":"stddev","children":[]},{"title":"Sum","anchor":"sum","children":[]},{"title":"Variance","anchor":"variance","children":[]},{"title":"StringAgg","anchor":"stringagg","children":[]}]}]},{"title":"查询相关工具","anchor":"query-related-tools","children":[{"title":"Q() 对象","anchor":"q-objects","children":[]},{"title":"Prefetch() 对象","anchor":"prefetch-objects","children":[]},{"title":"prefetch_related_objects()","anchor":"prefetch-related-objects","children":[]},{"title":"FilteredRelation() 对象","anchor":"filteredrelation-objects","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.1/ref/"},{"docname":"ref/models/index","title":"模型","url":"/zh-hans/6.1/ref/models/"}],"prev":{"docname":"ref/models/instances","title":"模型实例参考","url":"/zh-hans/6.1/ref/models/instances/"},"next":{"docname":"ref/models/lookups","title":"查找 API 参考","url":"/zh-hans/6.1/ref/models/lookups/"},"formats":{"html":"/zh-hans/6.1/ref/models/querysets/","markdown":"/zh-hans/6.1/ref/models/querysets.md","json":"/zh-hans/6.1/ref/models/querysets.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/models/querysets.txt","official":"https://docs.djangoproject.com/zh-hans/6.1/ref/models/querysets/","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"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}