{"title":"查找 API 参考","version":"4.1","locale":"zh-hans","docname":"ref/models/lookups","url":"/zh-hans/4.1/ref/models/lookups/","canonical":"https://djangodocs.dev/zh-hans/4.1/ref/models/lookups/","summary":"本文档提供了查找的 API 参考，它是 Django 的 API，用于构建数据库查询的 WHERE 子句。要学习如何 使用 查找，请看 执行查询 ；要学习如何 创建 新的查找，请看 如何编写自定义的查询器 。 查找 API 有两个组成部分：一个是 RegisterLookupMixin 类，用于注册查找；另一个是 查询表达式…","html":"<span id=\"lookup-api-reference\"></span><h1>查找 API 参考<a class=\"heading-anchor\" href=\"#module-django.db.models.lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>本文档提供了查找的 API 参考，它是 Django 的 API，用于构建数据库查询的 <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> 子句。要学习如何 <em>使用</em> 查找，请看 <a class=\"reference internal\" href=\"/zh-hans/4.1/topics/db/queries/\"><span class=\"doc\">执行查询</span></a>；要学习如何 <em>创建</em> 新的查找，请看 <a class=\"reference internal\" href=\"/zh-hans/4.1/howto/custom-lookups/\"><span class=\"doc\">如何编写自定义的查询器</span></a>。</p>\n<p>查找 API 有两个组成部分：一个是 <a class=\"reference internal\" href=\"#django.db.models.lookups.RegisterLookupMixin\" title=\"django.db.models.lookups.RegisterLookupMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RegisterLookupMixin</span></code></a> 类，用于注册查找；另一个是 <a class=\"reference internal\" href=\"#query-expression\"><span class=\"std std-ref\">查询表达式 API</span></a>，一个类要想注册为查找，必须实现一组方法。</p>\n<p>Django 有两个遵循查询表达式 API 的基类，所有 Django 内置的查找都是从这里派生出来的。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.db.models.Lookup\" title=\"django.db.models.Lookup\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Lookup</span></code></a>：查找一个字段（例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">field_name__exact</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">exact</span></code>）</p></li>\n<li><p><a class=\"reference internal\" href=\"#django.db.models.Transform\" title=\"django.db.models.Transform\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Transform</span></code></a>：转换一个字段</p></li>\n</ul>\n<p>一个查找表达式由三部分组成：</p>\n<ul class=\"simple\">\n<li><p>字段部分（如 <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.filter(author__best_friends__first_name...</span></code>）；</p></li>\n<li><p>转换部分（可省略）（如 <code class=\"docutils literal notranslate\"><span class=\"pre\">__lower__first3chars__reversed</span></code>）；</p></li>\n<li><p>查找（例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">__icontains</span></code>），如果省略，默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">__exact</span></code>。</p></li>\n</ul>\n<section id=\"registration-api\">\n<span id=\"lookup-registration-api\"></span><h2>注册 API<a class=\"heading-anchor\" href=\"#registration-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django 使用 <a class=\"reference internal\" href=\"#django.db.models.lookups.RegisterLookupMixin\" title=\"django.db.models.lookups.RegisterLookupMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RegisterLookupMixin</span></code></a> 来给一个类提供对自己进行注册查找的接口。两个突出的例子是 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a>，所有模型字段的基类，以及 <a class=\"reference internal\" href=\"#django.db.models.Transform\" title=\"django.db.models.Transform\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Transform</span></code></a>，所有 Django 变换的基类。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.lookups.RegisterLookupMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">lookups.</span></span><span class=\"sig-name descname\"><span class=\"pre\">RegisterLookupMixin</span></span><a class=\"heading-anchor\" href=\"#django.db.models.lookups.RegisterLookupMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个在类上实现查找 API 的混入。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.lookups.RegisterLookupMixin.register_lookup\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">register_lookup</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lookup</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lookup_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.lookups.RegisterLookupMixin.register_lookup\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>在类中注册一个新的查找。例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField.register_lookup(YearExact)</span></code> 将在 <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> 上注册 <code class=\"docutils literal notranslate\"><span class=\"pre\">YearExact</span></code> 的查找。它将覆盖已经存在的同名查找。如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_name</span></code> 将被用于这个查找，否则 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup.lookup_name</span></code> 将被使用。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.lookups.RegisterLookupMixin.get_lookup\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_lookup</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lookup_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.lookups.RegisterLookupMixin.get_lookup\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回在类中注册的名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_name</span></code> 的 <a class=\"reference internal\" href=\"#django.db.models.Lookup\" title=\"django.db.models.Lookup\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Lookup</span></code></a>。默认的实现是递归地查找所有父类，并检查是否有名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_name</span></code> 的注册查找，返回第一个匹配的类。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.lookups.RegisterLookupMixin.get_lookups\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_lookups</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.lookups.RegisterLookupMixin.get_lookups\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回映射到 <a class=\"reference internal\" href=\"#django.db.models.Lookup\" title=\"django.db.models.Lookup\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Lookup</span></code></a> 类的类中注册的每个查找名称的字典。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.lookups.RegisterLookupMixin.get_transform\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_transform</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">transform_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.lookups.RegisterLookupMixin.get_transform\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">transform_name</span></code> 的 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">transform</span></code>。缺省的实现是递归地查找所有父类，检查是否有名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">transform_name</span></code> 的注册变换，返回第一个匹配的类。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>一个类要想成为查找，必须遵循 <a class=\"reference internal\" href=\"#query-expression\"><span class=\"std std-ref\">查询表达式 API</span></a>。 <a class=\"reference internal\" href=\"#django.db.models.Lookup\" title=\"django.db.models.Lookup\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Lookup</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.Transform\" title=\"django.db.models.Transform\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Transform</span></code></a> 自然遵循这个API。</p>\n</section>\n<section id=\"the-query-expression-api\">\n<span id=\"query-expression\"></span><h2>查询表达式 API<a class=\"heading-anchor\" href=\"#the-query-expression-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>查询表达式 API 是一组通用的方法，这些方法被定义为可用于查询表达式，将自己翻译成 SQL 表达式。直接字段引用、聚合和 <code class=\"docutils literal notranslate\"><span class=\"pre\">Transform</span></code> 是遵循这个 API 的例子。当一个类实现了以下方法时，就可以说它遵循了查询表达式 API：</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.as_sql\">\n<span class=\"sig-name descname\"><span class=\"pre\">as_sql</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">compiler</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.as_sql\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>生成表达式的 SQL 片段。返回一个元组 <code class=\"docutils literal notranslate\"><span class=\"pre\">(sql,</span> <span class=\"pre\">params)</span></code>，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code> 是 SQL 字符串，<code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 是查询参数的列表或元组。<code class=\"docutils literal notranslate\"><span class=\"pre\">compiler</span></code> 是一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">SQLCompiler</span></code> 对象，它有一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">compile()</span></code> 方法，可以用来编译其他表达式。<code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code> 是用于执行查询的连接。</p>\n<p>调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">expression.as_sql()</span></code> 通常是不正确的，应该使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">compiler.compile(expression)</span></code>。<code class=\"docutils literal notranslate\"><span class=\"pre\">compiler.compile()</span></code> 方法将负责调用特定厂商的表达式方法。</p>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">as_vendorname()</span></code> 方法或子类很可能需要提供数据来覆盖 SQL 字符串的生成，可以在这个方法上定义自定义关键字参数。参见 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/models/expressions/#django.db.models.Func.as_sql\" title=\"django.db.models.Func.as_sql\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Func.as_sql()</span></code></a> 的用法示例。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.as_vendorname\">\n<span class=\"sig-name descname\"><span class=\"pre\">as_vendorname</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">compiler</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.as_vendorname\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>和 <code class=\"docutils literal notranslate\"><span class=\"pre\">as_sql()</span></code> 方法一样工作。当一个表达式被 <code class=\"docutils literal notranslate\"><span class=\"pre\">compiler.compile()</span></code> 编译后，Django 会先尝试调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">as_vendorname()</span></code>，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">vendorname</span></code> 是执行查询的后端厂商名称。<code class=\"docutils literal notranslate\"><span class=\"pre\">vendorname</span></code> 是 Django 内置后端的 <code class=\"docutils literal notranslate\"><span class=\"pre\">postgresql</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">oracle</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">sqlite</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">mysql</span></code> 中的一个。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.get_lookup\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_lookup</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lookup_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.get_lookup\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>必须返回名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_name</span></code> 的查找。例如，返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.output_field.get_lookup(lookup_name)</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.get_transform\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_transform</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">transform_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.get_transform\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>必须返回名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">transform_name</span></code> 的查找。例如，返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.output_field.get_transform(transform_name)</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.output_field\">\n<span class=\"sig-name descname\"><span class=\"pre\">output_field</span></span><a class=\"heading-anchor\" href=\"#django.db.models.output_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_lookup()</span></code> 方法返回的类的类型。它必须是一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 实例。</p>\n</dd></dl>\n\n</section>\n<section id=\"transform-reference\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">Transform</span></code> 参考<a class=\"heading-anchor\" href=\"#transform-reference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Transform\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Transform</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Transform\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Transform</span></code> 是一个实现字段转换的通用类。一个突出的例子是 <code class=\"docutils literal notranslate\"><span class=\"pre\">__year</span></code>，它将 <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> 转变为 <code class=\"docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code>。</p>\n<p>在查询表达式中使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Transform</span></code> 的符号是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;expression&gt;__&lt;transformation&gt;</span></code> （例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">date__year</span></code>）。</p>\n<p>这个类遵循 <a class=\"reference internal\" href=\"#query-expression\"><span class=\"std std-ref\">查询表达式 API</span></a>，这意味着你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;expression&gt;__&lt;transform1&gt;__&lt;transform2&gt;</span></code>。它是一个专门的 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/models/expressions/#func-expressions\"><span class=\"std std-ref\">Func() 表达式</span></a>，只接受一个参数。 它也可以用在过滤器的右侧，或者直接作为注解使用。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Transform.bilateral\">\n<span class=\"sig-name descname\"><span class=\"pre\">bilateral</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Transform.bilateral\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个布尔值，表示这一转换是否应适用于 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">rhs</span></code>。双边转换将按照查找表达式中出现的顺序应用于 <code class=\"docutils literal notranslate\"><span class=\"pre\">rhs</span></code>。默认情况下，它被设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。关于用法示例，请参见 <a class=\"reference internal\" href=\"/zh-hans/4.1/howto/custom-lookups/\"><span class=\"doc\">如何编写自定义的查询器</span></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Transform.lhs\">\n<span class=\"sig-name descname\"><span class=\"pre\">lhs</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Transform.lhs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>左侧——正在转换的内容。它必须遵循 <a class=\"reference internal\" href=\"#query-expression\"><span class=\"std std-ref\">查询表达式 API</span></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Transform.lookup_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">lookup_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Transform.lookup_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>查找的名称，用于在解析查询表达式时识别它。它不能包含字符串 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;__&quot;</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Transform.output_field\">\n<span class=\"sig-name descname\"><span class=\"pre\">output_field</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Transform.output_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>定义这个转换输出的类。它必须是一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> 实例。默认情况下是与其 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs.output_field</span></code> 相同。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"lookup-reference\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">Lookup</span></code> 参考<a class=\"heading-anchor\" href=\"#lookup-reference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Lookup\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Lookup</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Lookup\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Lookup</span></code> 是一个实现查找的通用类。一个查找是一个查询表达式，它的左侧是 <a class=\"reference internal\" href=\"#django.db.models.Lookup.lhs\" title=\"django.db.models.Lookup.lhs\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">lhs</span></code></a>；右侧是 <a class=\"reference internal\" href=\"#django.db.models.Lookup.rhs\" title=\"django.db.models.Lookup.rhs\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">rhs</span></code></a>；还有一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_name</span></code>，用于在 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">rhs</span></code> 之间进行布尔比较，例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span> <span class=\"pre\">in</span> <span class=\"pre\">rhs</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span> <span class=\"pre\">&gt;</span> <span class=\"pre\">rhs</span></code>。</p>\n<p>在表达式中使用查找的主要符号是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;lhs&gt;__&lt;lookup_name&gt;=&lt;rhs&gt;</span></code>。查询也可以直接在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></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=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">LessThan</span><span class=\"p\">(</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s1\">&#39;word_count&#39;</span><span class=\"p\">),</span> <span class=\"mi\">7500</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=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">is_short_story</span><span class=\"o\">=</span><span class=\"n\">LessThan</span><span class=\"p\">(</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s1\">&#39;word_count&#39;</span><span class=\"p\">),</span> <span class=\"mi\">7500</span><span class=\"p\">))</span>\n</code></pre></div>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Lookup.lhs\">\n<span class=\"sig-name descname\"><span class=\"pre\">lhs</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Lookup.lhs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>左手边——被查询的内容。该对象通常遵循 <a class=\"reference internal\" href=\"#query-expression\"><span class=\"std std-ref\">查询表达式 API</span></a>。它也可以是一个普通的值。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Lookup.rhs\">\n<span class=\"sig-name descname\"><span class=\"pre\">rhs</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Lookup.rhs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>右侧——<code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span></code> 与什么进行比较。它可以是一个普通的值，也可以是编译成 SQL 的东西，通常是一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">F()</span></code> 对象或一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Lookup.lookup_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">lookup_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Lookup.lookup_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个查询的名称，用于在解析查询表达式时识别它。它不能包含字符串 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;__&quot;</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Lookup.process_lhs\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_lhs</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">compiler</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lhs</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Lookup.process_lhs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回由 <code class=\"docutils literal notranslate\"><span class=\"pre\">compiler.compile(lhs)</span></code> 返回的元组 <code class=\"docutils literal notranslate\"><span class=\"pre\">(lhs_string,</span> <span class=\"pre\">lhs_params)</span></code>。这个方法可以被重写来调整 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span></code> 的处理方式。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">compiler</span></code> 是一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">SQLCompiler</span></code> 对象，可以像 <code class=\"docutils literal notranslate\"><span class=\"pre\">compiler.compile(lhs)</span></code> 一样用来编译 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span></code>。<code class=\"docutils literal notranslate\"><span class=\"pre\">connection</span></code> 可以用于编译厂商特定的 SQL。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span></code> 不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，就用它作为处理后的 <code class=\"docutils literal notranslate\"><span class=\"pre\">lhs</span></code> 代替 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.lhs</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Lookup.process_rhs\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_rhs</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">compiler</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">connection</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Lookup.process_rhs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>右侧的行为与 <a class=\"reference internal\" href=\"#django.db.models.Lookup.process_lhs\" title=\"django.db.models.Lookup.process_lhs\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">process_lhs()</span></code></a> 相同。</p>\n</dd></dl>\n\n<aside class=\"version-note version-changed\" data-version=\"4.0\">\n<p class=\"version-note-title\">Changed in Django 4.0</p><p>增加了对在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 注解、聚合和直接在过滤器中使用查找的支持。</p>\n</aside>\n</dd></dl>\n\n</section>","rootId":"module-django.db.models.lookups","toc":[{"title":"注册 API","anchor":"registration-api","children":[]},{"title":"查询表达式 API","anchor":"the-query-expression-api","children":[]},{"title":"Transform 参考","anchor":"transform-reference","children":[]},{"title":"Lookup 参考","anchor":"lookup-reference","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/4.1/ref/"},{"docname":"ref/models/index","title":"模型","url":"/zh-hans/4.1/ref/models/"}],"prev":{"docname":"ref/models/querysets","title":"QuerySet API 参考","url":"/zh-hans/4.1/ref/models/querysets/"},"next":{"docname":"ref/models/expressions","title":"查询表达式","url":"/zh-hans/4.1/ref/models/expressions/"},"formats":{"html":"/zh-hans/4.1/ref/models/lookups/","markdown":"/zh-hans/4.1/ref/models/lookups.md","json":"/zh-hans/4.1/ref/models/lookups.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/ref/models/lookups.txt","official":"https://docs.djangoproject.com/zh-hans/4.1/ref/models/lookups/","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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}