{"title":"PostgreSQL 特有模型字段","version":"3.1","locale":"zh-hans","docname":"ref/contrib/postgres/fields","url":"/zh-hans/3.1/ref/contrib/postgres/fields/","canonical":"https://djangodocs.dev/zh-hans/3.1/ref/contrib/postgres/fields/","summary":"所有这些字段都可以从 django.contrib.postgres.field 模块中获得。Index 和 Field.db_index 都创建了一个 B 树索引，在查询复杂的数据类型时并不是特别有用。","html":"<h1>PostgreSQL 特有模型字段<a class=\"heading-anchor\" href=\"#postgresql-specific-model-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>所有这些字段都可以从 <code class=\"docutils literal notranslate\">django.contrib.postgres.field</code> 模块中获得。</p>\n<section id=\"indexing-these-fields\">\n<h2>对这些字段进行索引<a class=\"heading-anchor\" href=\"#indexing-these-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/indexes/#django.db.models.Index\" title=\"django.db.models.Index\"><code class=\"xref py py-class docutils literal notranslate\">Index</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\">Field.db_index</code></a> 都创建了一个 B 树索引，在查询复杂的数据类型时并不是特别有用。像 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GinIndex\" title=\"django.contrib.postgres.indexes.GinIndex\"><code class=\"xref py py-class docutils literal notranslate\">GinIndex</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GistIndex\" title=\"django.contrib.postgres.indexes.GistIndex\"><code class=\"xref py py-class docutils literal notranslate\">GistIndex</code></a> 这样的索引比较适合，不过索引的选择取决于你使用的查询。一般来说，GiST 可能是 <span class=\"xref std std-ref\">range 字段 &lt;range-fields&gt;`和 :class:`HStoreField</span> 的好选择，而 GIN 可能对 <a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> 有帮助。</p>\n</section>\n<section id=\"arrayfield\">\n<h2><code class=\"docutils literal notranslate\">ArrayField</code><a class=\"heading-anchor\" href=\"#arrayfield\"><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.contrib.postgres.fields.ArrayField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ArrayField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">base_field</em>, <em class=\"sig-param\">size<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.contrib.postgres.fields.ArrayField\"><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.contrib.postgres.fields.ArrayField.base_field\" title=\"django.contrib.postgres.fields.ArrayField.base_field\"><code class=\"xref py py-attr docutils literal notranslate\">base_field</code></a>。你也可以指定一个 <a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField.size\" title=\"django.contrib.postgres.fields.ArrayField.size\"><code class=\"xref py py-attr docutils literal notranslate\">size</code></a>。<code class=\"docutils literal notranslate\">ArrayField</code> 可以嵌套来存储多维数组。</p>\n<p>如果你给字段一个 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a>，确保它是一个可调用对象，比如``list`` （对于一个空的默认值），或者一个返回一个列表的可调用对象（比如一个函数）。错误地使用 <code class=\"docutils literal notranslate\">default=[]</code> 会创建一个可变的默认值，这个默认值在 <code class=\"docutils literal notranslate\">ArrayField</code> 的所有实例之间共享。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.ArrayField.base_field\">\n<span class=\"sig-name descname\">base_field</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.ArrayField.base_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这是一个必要的参数。</p>\n<p>指定数组的基础数据类型和行为。它应该是 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> 的一个子类的实例。例如，它可以是一个 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a> 或一个 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>。除了那些处理关系型数据的字段（<a class=\"reference internal\" href=\"/zh-hans/3.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/3.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/3.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<p>可以嵌套数组字段——你可以指定一个 <code class=\"docutils literal notranslate\">ArrayField</code> 的实例作为 <code class=\"docutils literal notranslate\">base_field</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.contrib.postgres.fields</span> <span class=\"kn\">import</span> ArrayField\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">ChessBoard</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    board <span class=\"o\">=</span> ArrayField<span class=\"p\">(</span>\n        ArrayField<span class=\"p\">(</span>\n            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> blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span>\n            size<span class=\"o\">=</span><span class=\"mi\">8</span><span class=\"p\">,</span>\n        <span class=\"p\">),</span>\n        size<span class=\"o\">=</span><span class=\"mi\">8</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>数据库和模型之间的值的转换、数据和配置的验证以及序列化都是委托给底层基础字段的。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.ArrayField.size\">\n<span class=\"sig-name descname\">size</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.ArrayField.size\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这是一个可选的参数。</p>\n<p>如果传入，数组将有一个指定的最大大小。这将被传递给数据库，尽管 PostgreSQL 目前并没有强制执行这个限制。</p>\n</dd></dl>\n\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\">ArrayField</code> 时，无论是否使用 <code class=\"docutils literal notranslate\">size</code> 参数，PostgreSQL 都要求数组为矩形：</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.contrib.postgres.fields</span> <span class=\"kn\">import</span> ArrayField\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Board</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    pieces <span class=\"o\">=</span> ArrayField<span class=\"p\">(</span>ArrayField<span class=\"p\">(</span>models<span class=\"o\">.</span>IntegerField<span class=\"p\">()))</span>\n\n<span class=\"c1\"># Valid</span>\nBoard<span class=\"p\">(</span>pieces<span class=\"o\">=</span><span class=\"p\">[</span>\n    <span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">],</span>\n    <span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">],</span>\n<span class=\"p\">])</span>\n\n<span class=\"c1\"># Not valid</span>\nBoard<span class=\"p\">(</span>pieces<span class=\"o\">=</span><span class=\"p\">[</span>\n    <span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">],</span>\n    <span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">],</span>\n<span class=\"p\">])</span>\n</code></pre></div>\n<p>如果需要不规则的形状，则应将底层字段设为 null，并将值用 <code class=\"docutils literal notranslate\">None</code> 填充。</p>\n</aside>\n<section id=\"querying-arrayfield\">\n<h3>查询 <code class=\"docutils literal notranslate\">ArrayField</code><a class=\"heading-anchor\" href=\"#querying-arrayfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> 有许多自定义的查找和转换。我们将使用下面的示例模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.fields</span> <span class=\"kn\">import</span> ArrayField\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Post</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\">200</span><span class=\"p\">)</span>\n    tags <span class=\"o\">=</span> ArrayField<span class=\"p\">(</span>models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">),</span> blank<span class=\"o\">=</span><span class=\"kc\">True</span><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=\"bp\">self</span><span class=\"o\">.</span>name\n</code></pre></div>\n<section id=\"contains\">\n<span id=\"std-fieldlookup-arrayfield.contains\"></span><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<p><a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/querysets/#std-fieldlookup-contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a> 查找在 <a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> 上被覆盖。返回的对象将是那些传入值子集的数据。它使用 SQL 运算符 <code class=\"docutils literal notranslate\">&#64;&gt;</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>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;First post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Second post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Third post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;tutorial&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__contains<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__contains<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Third post&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__contains<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"contained-by\">\n<span id=\"std-fieldlookup-arrayfield.contained_by\"></span><h4><code class=\"docutils literal notranslate\">contained_by</code><a class=\"heading-anchor\" href=\"#contained-by\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>这是 <a class=\"reference internal\" href=\"#std-fieldlookup-arrayfield.contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a> 查找的反义词——返回的对象将是那些传入值子集的数据。它使用 SQL 运算符 <code class=\"docutils literal notranslate\">&lt;&#64;`</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>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;First post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Second post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Third post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;tutorial&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__contained_by<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__contained_by<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;tutorial&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;, &lt;Post: Third post&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"overlap\">\n<span id=\"std-fieldlookup-arrayfield.overlap\"></span><h4><code class=\"docutils literal notranslate\">overlap</code><a class=\"heading-anchor\" href=\"#overlap\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>返回数据与传递的值共享任何结果的对象。使用 SQL 运算符 <code class=\"docutils literal notranslate\">&amp;&amp;</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>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;First post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Second post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Third post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;tutorial&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__overlap<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__overlap<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;tutorial&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;, &lt;Post: Third post&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"len\">\n<span id=\"std-fieldlookup-arrayfield.len\"></span><h4><code class=\"docutils literal notranslate\">len</code><a class=\"heading-anchor\" href=\"#len\"><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/3.1/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a> 的查找。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;First post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Second post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__len<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: Second post&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"index-transforms\">\n<span id=\"std-fieldlookup-arrayfield.index\"></span><h4>索引转换<a class=\"heading-anchor\" href=\"#index-transforms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>索引转换将索引转化为数组。可以使用任何非负的整数。如果超过数组的 <a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField.size\" title=\"django.contrib.postgres.fields.ArrayField.size\"><code class=\"xref py py-attr docutils literal notranslate\">size</code></a>，则不会出错。变换后可用的查找是来自 <a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField.base_field\" title=\"django.contrib.postgres.fields.ArrayField.base_field\"><code class=\"xref py py-attr docutils literal notranslate\">base_field</code></a> 的查找。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;First post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Second post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__0<span class=\"o\">=</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__1__iexact<span class=\"o\">=</span><span class=\"s1\">&#39;Django&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__276<span class=\"o\">=</span><span class=\"s1\">&#39;javascript&#39;</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>PostgreSQL 在编写原始 SQL 时，对数组字段使用基于 1 的索引。然而这些索引和 <a class=\"reference internal\" href=\"#std-fieldlookup-arrayfield.slice\"><code class=\"xref std std-lookup docutils literal notranslate\">slices</code></a> 中使用的索引使用基于 0 的索引，以与 Python 保持一致。</p>\n</aside>\n</section>\n<section id=\"slice-transforms\">\n<span id=\"std-fieldlookup-arrayfield.slice\"></span><h4>切片转换<a class=\"heading-anchor\" href=\"#slice-transforms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\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=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;First post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;django&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Second post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Third post&#39;</span><span class=\"p\">,</span> tags<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;python&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__0_1<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Post<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>tags__0_2__contains<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;thoughts&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Post: First post&gt;, &lt;Post: Second post&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>PostgreSQL 在编写原始 SQL 时，对数组字段使用基于 1 的索引。然而这些分片和 <a class=\"reference internal\" href=\"#std-fieldlookup-arrayfield.index\"><code class=\"xref std std-lookup docutils literal notranslate\">indexes</code></a> 中使用的分片使用基于 0 的索引，以与 Python 保持一致。</p>\n</aside>\n<aside class=\"admonition-multidimensional-arrays-with-indexes-and-slices admonition\" role=\"note\">\n<p class=\"admonition-title\">带索引和切片的多维数组</p>\n<p>PostgreSQL 在多维数组上使用索引和切片时，有一些相当神秘的行为。使用索引向下到达最终的底层数据总是可行的，但是大多数其他的切片在数据库层面的行为很奇怪，不能被 Django 以逻辑的、一致的方式支持。</p>\n</aside>\n</section>\n</section>\n</section>\n<section id=\"citext-fields\">\n<h2><code class=\"docutils literal notranslate\">CIText</code> 字段<a class=\"heading-anchor\" href=\"#citext-fields\"><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.contrib.postgres.fields.CIText\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CIText</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.CIText\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个用于创建由 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/citext.html\">citext</a> 类型支持的不区分大小写的文本字段的混入。在使用它之前，请阅读 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/citext.html#id-1.11.7.17.7\">性能考虑因素</a> 。</p>\n<p>要使用 <code class=\"docutils literal notranslate\">citext</code>，在第一次 <code class=\"docutils literal notranslate\">CreateModel</code> 迁移操作之前，使用 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CITextExtension\" title=\"django.contrib.postgres.operations.CITextExtension\"><code class=\"xref py py-class docutils literal notranslate\">CITextExtension</code></a> 操作 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/contrib/postgres/operations/#create-postgresql-extensions\"><span class=\"std std-ref\">在PostgreSQL 中设置 citext 扩展</span></a>。</p>\n<p>如果你使用的是 <a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> 的 <code class=\"docutils literal notranslate\">CIText</code> 字段，你必须在你的 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 中添加 <code class=\"docutils literal notranslate\">'django.contrib.postgres'</code>，否则字段值会以字符串形式出现，比如 <code class=\"docutils literal notranslate\">'{thoughts,django}'</code>。</p>\n<p>提供了几个使用混入的字段：</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.CICharField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CICharField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.CICharField\"><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 class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.CIEmailField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CIEmailField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.CIEmailField\"><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 class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.CITextField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CITextField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.CITextField\"><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/3.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.EmailField\" title=\"django.db.models.EmailField\"><code class=\"xref py py-class docutils literal notranslate\">EmailField</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.TextField\" title=\"django.db.models.TextField\"><code class=\"xref py py-class docutils literal notranslate\">TextField</code></a> 的子类。</p>\n<p><code class=\"docutils literal notranslate\">max_length</code> 不会在数据库中强制执行，因为 <code class=\"docutils literal notranslate\">citext</code> 与 PostgreSQL 的 <code class=\"docutils literal notranslate\">text</code> 类型相似。</p>\n</dd></dl>\n\n</section>\n<section id=\"hstorefield\">\n<h2><code class=\"docutils literal notranslate\">HStoreField</code><a class=\"heading-anchor\" href=\"#hstorefield\"><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.contrib.postgres.fields.HStoreField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">HStoreField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.HStoreField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个用于存储键值对的字段。使用的 Python 数据类型是 <code class=\"docutils literal notranslate\">dict</code>。键必须是字符串，值可以是字符串或空值（Python 中的 <code class=\"docutils literal notranslate\">None</code>）。</p>\n<p>要使用该字段，你需要：</p>\n<ol class=\"arabic simple\">\n<li><p>在你的 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 中增加 <code class=\"docutils literal notranslate\">'django.contrib.postgres'</code>。</p></li>\n<li><p>在 PostgreSQL 中 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/contrib/postgres/operations/#create-postgresql-extensions\"><span class=\"std std-ref\">安装 hstore 扩展</span></a>。</p></li>\n</ol>\n<p>如果你跳过第一步，你会看到一个错误，比如 <code class=\"docutils literal notranslate\">can't adapt type 'dict'</code>，如果你跳过第二步，你会看到 <code class=\"docutils literal notranslate\">type &quot;hstore&quot; does not exist</code>。</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=\"/zh-hans/3.1/ref/contrib/postgres/validators/#django.contrib.postgres.validators.KeysValidator\" title=\"django.contrib.postgres.validators.KeysValidator\"><code class=\"xref py py-class docutils literal notranslate\">KeysValidator</code></a> 来完成。</p>\n</aside>\n<section id=\"querying-hstorefield\">\n<h3>查询 <code class=\"docutils literal notranslate\">HStoreField</code><a class=\"heading-anchor\" href=\"#querying-hstorefield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>除了按键查询的功能外，<code class=\"docutils literal notranslate\">HStoreField</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.contrib.postgres.fields</span> <span class=\"kn\">import</span> HStoreField\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Dog</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\">200</span><span class=\"p\">)</span>\n    data <span class=\"o\">=</span> HStoreField<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=\"bp\">self</span><span class=\"o\">.</span>name\n</code></pre></div>\n<section id=\"key-lookups\">\n<span id=\"std-fieldlookup-hstorefield.key\"></span><h4>键查找<a class=\"heading-anchor\" href=\"#key-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\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=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__breed<span class=\"o\">=</span><span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</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=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__breed__contains<span class=\"o\">=</span><span class=\"s1\">&#39;l&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;, &lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n<p>如果你想查询的键与另一个查找的名称冲突，你需要使用 <a class=\"reference internal\" href=\"#std-fieldlookup-hstorefield.contains\"><code class=\"xref std std-lookup docutils literal notranslate\">hstorefield.contains</code></a> 查找来代替。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>由于任何字符串都可能是 hstore 值中的一个键，因此除了下面列出的以外的任何查询都将被解释为键查询。不会出现任何错误。要格外小心输入错误，并始终检查你的查询是否按照你的意图工作。</p>\n</aside>\n</section>\n<section id=\"std-fieldlookup-hstorefield.contains\">\n<span id=\"id1\"></span><h4><code class=\"docutils literal notranslate\">contains</code><a class=\"heading-anchor\" href=\"#std-fieldlookup-hstorefield.contains\"><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/3.1/ref/models/querysets/#std-fieldlookup-contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a> 查找在 <code class=\"xref py py-class docutils literal notranslate\">HStoreField</code> 上被覆盖。返回的对象是那些给定的 <code class=\"docutils literal notranslate\">dict</code> 的键值对都包含在字段中的对象。它使用 SQL 运算符 <code class=\"docutils literal notranslate\">&#64;&gt;</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contains<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;, &lt;Dog: Meg&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contains<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"std-fieldlookup-hstorefield.contained_by\">\n<span id=\"id2\"></span><h4><code class=\"docutils literal notranslate\">contained_by</code><a class=\"heading-anchor\" href=\"#std-fieldlookup-hstorefield.contained_by\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>这是 <a class=\"reference internal\" href=\"#std-fieldlookup-hstorefield.contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</code></a> 查找的反义词——返回的对象将是那些传入值子集对象上的键值对。它使用 SQL 运算符 <code class=\"docutils literal notranslate\">&lt;&#64;</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contained_by<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;, &lt;Dog: Fred&gt;]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__contained_by<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Fred&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"has-key\">\n<span id=\"std-fieldlookup-hstorefield.has_key\"></span><h4><code class=\"docutils literal notranslate\">has_key</code><a class=\"heading-anchor\" href=\"#has-key\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>返回数据中给定键所在的对象。使用 SQL 运算符 <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><span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__has_key<span class=\"o\">=</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"has-any-keys\">\n<span id=\"std-fieldlookup-hstorefield.has_any_keys\"></span><h4><code class=\"docutils literal notranslate\">has_any_keys</code><a class=\"heading-anchor\" href=\"#has-any-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>返回数据中任意给定键的对象。使用 SQL 运算符 <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><span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Fred&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__has_any_keys<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;, &lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"has-keys\">\n<span id=\"std-fieldlookup-hstorefield.has_keys\"></span><h4><code class=\"docutils literal notranslate\">has_keys</code><a class=\"heading-anchor\" href=\"#has-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>返回数据中所有给定键的对象。使用 SQL 运算符 <code class=\"docutils literal notranslate\">?&amp;</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__has_keys<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"keys\">\n<span id=\"std-fieldlookup-hstorefield.keys\"></span><h4><code class=\"docutils literal notranslate\">keys</code><a class=\"heading-anchor\" href=\"#keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>返回键数组为给定值的对象。需要注意的是，这个顺序并不能保证可靠，所以这个变换主要是用于与 <a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a> 上的查找结合使用。使用 SQL 函数 <code class=\"docutils literal notranslate\">akeys()</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;toy&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;bone&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__keys__overlap<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;toy&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Rufus&gt;, &lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"values\">\n<span id=\"std-fieldlookup-hstorefield.values\"></span><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<p>Returns objects where the array of values is the given value. Note that the\norder is not guaranteed to be reliable, so this transform is mainly useful for\nusing in conjunction with lookups on\n<a class=\"reference internal\" href=\"#django.contrib.postgres.fields.ArrayField\" title=\"django.contrib.postgres.fields.ArrayField\"><code class=\"xref py py-class docutils literal notranslate\">ArrayField</code></a>. Uses the SQL function\n<code class=\"docutils literal notranslate\">avals()</code>. For example:</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>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Rufus&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;labrador&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Meg&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;breed&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;owner&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Bob&#39;</span><span class=\"p\">})</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>Dog<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>data__values__contains<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;collie&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;QuerySet [&lt;Dog: Meg&gt;]&gt;</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"jsonfield\">\n<h2><code class=\"docutils literal notranslate\">JSONField</code><a class=\"heading-anchor\" href=\"#jsonfield\"><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.contrib.postgres.fields.JSONField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">JSONField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">encoder<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.contrib.postgres.fields.JSONField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个用于存储 JSON 编码数据的字段。在 Python 中，数据以其 Python 本地格式表示：字典、列表、字符串、数字、布尔值和 <code class=\"docutils literal notranslate\">None</code>。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.JSONField.encoder\">\n<span class=\"sig-name descname\">encoder</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.JSONField.encoder\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个可选的 JSON 编码类，用于序列化标准 JSON 序列化器不支持的数据类型（<code class=\"docutils literal notranslate\">datetime</code>、<code class=\"docutils literal notranslate\">uuid</code> 等）。例如，你可以使用 <a class=\"reference internal\" href=\"/zh-hans/3.1/topics/serialization/#django.core.serializers.json.DjangoJSONEncoder\" title=\"django.core.serializers.json.DjangoJSONEncoder\"><code class=\"xref py py-class docutils literal notranslate\">DjangoJSONEncoder</code></a> 类或任何其他 <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#json.JSONEncoder\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">json.JSONEncoder</code></a> 子类。</p>\n<p>当从数据库中获取值时，它将以自定义编码器选择的格式（最常见的是字符串），因此你需要采取额外的步骤将值转换回初始数据类型（<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/instances/#django.db.models.Model.from_db\" title=\"django.db.models.Model.from_db\"><code class=\"xref py py-meth docutils literal notranslate\">Model.from_db()</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.Field.from_db_value\" title=\"django.db.models.Field.from_db_value\"><code class=\"xref py py-meth docutils literal notranslate\">Field.from_db_value()</code></a> 是两个可能的钩子）。你的反序列化可能需要考虑到你无法确定输入类型的事实。例如，你有可能返回一个 <code class=\"docutils literal notranslate\">datetime</code>，但实际上是一个字符串，而这个字符串恰好与 <code class=\"docutils literal notranslate\">datetime</code> 的格式相同。</p>\n</dd></dl>\n\n<p>如果你给字段一个 <code class=\"xref py py-attr docutils literal notranslate\">default`</code>，确保它是一个可调用对象，比如 <code class=\"docutils literal notranslate\">dict</code> （对于一个空的默认值），或者一个返回字典的可调用对象（比如一个函数）。错误地使用 <code class=\"docutils literal notranslate\">default={}</code> 会创建一个可变的默认值，这个默认值在 <code class=\"docutils literal notranslate\">JSONField</code> 的所有实例之间共享。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>PostgreSQL 有两种基于 JSON 的原生数据类型： <code class=\"docutils literal notranslate\">json</code> 和 <code class=\"docutils literal notranslate\">jsonb</code>。<code class=\"docutils literal notranslate\">json</code> 和 <code class=\"docutils literal notranslate\">jsonb</code>。它们之间的主要区别在于它们的存储方式和查询方式。PostgreSQL 的 <code class=\"docutils literal notranslate\">json</code> 字段是作为 JSON 的原始字符串表示来存储的，当根据键来查询时，必须同时进行解码。<code class=\"docutils literal notranslate\">jsonb</code> 字段是基于 JSON 的实际结构存储的，它允许索引。这样做的代价是在写入 <code class=\"docutils literal notranslate\">jsonb</code> 字段时增加了一点成本。<code class=\"docutils literal notranslate\">JSONField</code> 使用 <code class=\"docutils literal notranslate\">jsonb</code>。</p>\n</aside>\n<aside class=\"version-note version-deprecated\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 3.1</p><p><span class=\"versionmodified deprecated\">Deprecated since version 3.1: </span>使用 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.JSONField</code></a> 代替。</p>\n</aside>\n<section id=\"querying-jsonfield\">\n<h3>查询 <code class=\"docutils literal notranslate\">JSONField</code><a class=\"heading-anchor\" href=\"#querying-jsonfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>详见 <a class=\"reference internal\" href=\"/zh-hans/3.1/topics/db/queries/#querying-jsonfield\"><span class=\"std std-ref\">查询 JSONField</span></a>。</p>\n</section>\n</section>\n<section id=\"range-fields\">\n<span id=\"id3\"></span><h2>范围字段<a class=\"heading-anchor\" href=\"#range-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>有五种范围字段类型，对应 PostgreSQL 中内置的范围类型。这些字段用来存储一个范围的值，例如一个事件的开始和结束时间戳，或者一个活动适合的年龄范围。</p>\n<p>所有的范围字段都翻译成 Python 中的 <a class=\"reference external\" href=\"https://www.psycopg.org/docs/extras.html#adapt-range\" title=\"(in Psycopg v2.9)\"><span class=\"xref std std-ref\">psycopg2 范围对象</span></a>，但如果不需要边界信息，也接受元组作为输入。默认是包含下界，排除上界，也就是 <code class=\"docutils literal notranslate\">[)</code> （关于 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-IO\">不同的边界</a> ），请参见 PostgreSQL 文档。</p>\n<section id=\"integerrangefield\">\n<h3><code class=\"docutils literal notranslate\">IntegerRangeField</code><a class=\"heading-anchor\" href=\"#integerrangefield\"><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.contrib.postgres.fields.IntegerRangeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">IntegerRangeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.IntegerRangeField\"><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/3.1/ref/models/fields/#django.db.models.IntegerField\" title=\"django.db.models.IntegerField\"><code class=\"xref py py-class docutils literal notranslate\">IntegerField</code></a>。在数据库中用 <code class=\"docutils literal notranslate\">int4range</code> 表示，在 Python 中用一个 <a class=\"reference external\" href=\"https://www.psycopg.org/docs/extras.html#psycopg2.extras.NumericRange\" title=\"(in Psycopg v2.9)\"><code class=\"xref py py-class docutils literal notranslate\">NumericRange</code></a> 表示。</p>\n<p>无论在保存数据时指定的边界是什么，PostgreSQL 总是以规范的形式返回一个包括下限和排除上限的范围，即 <code class=\"docutils literal notranslate\">[)</code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"bigintegerrangefield\">\n<h3><code class=\"docutils literal notranslate\">BigIntegerRangeField</code><a class=\"heading-anchor\" href=\"#bigintegerrangefield\"><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.contrib.postgres.fields.BigIntegerRangeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BigIntegerRangeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.BigIntegerRangeField\"><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/3.1/ref/models/fields/#django.db.models.BigIntegerField\" title=\"django.db.models.BigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">BigIntegerField</code></a>。在数据库中用 <code class=\"docutils literal notranslate\">int8range</code> 表示，在 Python 中用一个 <a class=\"reference external\" href=\"https://www.psycopg.org/docs/extras.html#psycopg2.extras.NumericRange\" title=\"(in Psycopg v2.9)\"><code class=\"xref py py-class docutils literal notranslate\">NumericRange</code></a> 表示。</p>\n<p>无论在保存数据时指定的边界是什么，PostgreSQL 总是以规范的形式返回一个包括下限和排除上限的范围，即 <code class=\"docutils literal notranslate\">[)</code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"decimalrangefield\">\n<h3><code class=\"docutils literal notranslate\">DecimalRangeField</code><a class=\"heading-anchor\" href=\"#decimalrangefield\"><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.contrib.postgres.fields.DecimalRangeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DecimalRangeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.DecimalRangeField\"><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/3.1/ref/models/fields/#django.db.models.DecimalField\" title=\"django.db.models.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\">DecimalField</code></a>。在数据库中用 <code class=\"docutils literal notranslate\">numrange</code> 表示，在 Python 中用一个 <a class=\"reference external\" href=\"https://www.psycopg.org/docs/extras.html#psycopg2.extras.NumericRange\" title=\"(in Psycopg v2.9)\"><code class=\"xref py py-class docutils literal notranslate\">NumericRange</code></a> 表示。</p>\n</dd></dl>\n\n</section>\n<section id=\"datetimerangefield\">\n<h3><code class=\"docutils literal notranslate\">DateTimeRangeField</code><a class=\"heading-anchor\" href=\"#datetimerangefield\"><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.contrib.postgres.fields.DateTimeRangeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DateTimeRangeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.DateTimeRangeField\"><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/3.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a>。在数据库中用 <code class=\"docutils literal notranslate\">tstzrange</code> 表示，在 Python 中用一个 <a class=\"reference external\" href=\"https://www.psycopg.org/docs/extras.html#psycopg2.extras.DateTimeTZRange\" title=\"(in Psycopg v2.9)\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeTZRange</code></a> 表示。</p>\n</dd></dl>\n\n</section>\n<section id=\"daterangefield\">\n<h3><code class=\"docutils literal notranslate\">DateRangeField</code><a class=\"heading-anchor\" href=\"#daterangefield\"><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.contrib.postgres.fields.DateRangeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DateRangeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.DateRangeField\"><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/3.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a>。在数据库中用 <code class=\"docutils literal notranslate\">daterange</code> 表示，在 Python 中用一个 <a class=\"reference external\" href=\"https://www.psycopg.org/docs/extras.html#psycopg2.extras.DateRange\" title=\"(in Psycopg v2.9)\"><code class=\"xref py py-class docutils literal notranslate\">DateRange</code></a> 表示。</p>\n<p>无论在保存数据时指定的边界是什么，PostgreSQL 总是以规范的形式返回一个包括下限和排除上限的范围，即 <code class=\"docutils literal notranslate\">[)</code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"querying-range-fields\">\n<h3>查询范围字段<a class=\"heading-anchor\" href=\"#querying-range-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\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.contrib.postgres.fields</span> <span class=\"kn\">import</span> IntegerRangeField\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Event</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\">200</span><span class=\"p\">)</span>\n    ages <span class=\"o\">=</span> IntegerRangeField<span class=\"p\">()</span>\n    start <span class=\"o\">=</span> models<span class=\"o\">.</span>DateTimeField<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=\"bp\">self</span><span class=\"o\">.</span>name\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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span> <span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>now <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Soft play&#39;</span><span class=\"p\">,</span> ages<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">),</span> start<span class=\"o\">=</span>now<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;Pub trip&#39;</span><span class=\"p\">,</span> ages<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"mi\">21</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">),</span> start<span class=\"o\">=</span>now <span class=\"o\">-</span> datetime<span class=\"o\">.</span>timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>和 <code class=\"docutils literal notranslate\">NumericRange</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><span class=\"kn\">from</span> <span class=\"nn\">psycopg2.extras</span> <span class=\"kn\">import</span> NumericRange\n</code></pre></div>\n<section id=\"containment-functions\">\n<h4>包含函数<a class=\"heading-anchor\" href=\"#containment-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>与其他 PostgreSQL 字段一样，有三个标准的包含运算符。<code class=\"docutils literal notranslate\">contains</code>、<code class=\"docutils literal notranslate\">contained_by</code> 和 <code class=\"docutils literal notranslate\">overlap</code>，分别使用 SQL 运算符 <code class=\"docutils literal notranslate\">&#64;&gt;</code>、<code class=\"docutils literal notranslate\">&lt;&#64;</code> 和 <code class=\"docutils literal notranslate\">&amp;&amp;</code>。</p>\n<section id=\"std-fieldlookup-rangefield.contains\">\n<span id=\"id4\"></span><h5><code class=\"docutils literal notranslate\">contains</code><a class=\"heading-anchor\" href=\"#std-fieldlookup-rangefield.contains\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__contains<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"std-fieldlookup-rangefield.contained_by\">\n<span id=\"id5\"></span><h5><code class=\"docutils literal notranslate\">contained_by</code><a class=\"heading-anchor\" href=\"#std-fieldlookup-rangefield.contained_by\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__contained_by<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">15</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;]&gt;</span>\n</code></pre></div>\n<p>contained_by` 也可以在非范围字段类型上进行查询： <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.SmallAutoField\" title=\"django.db.models.SmallAutoField\"><code class=\"xref py py-class docutils literal notranslate\">SmallAutoField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.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>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\">BigAutoField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.SmallIntegerField\" title=\"django.db.models.SmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">SmallIntegerField</code></a>、<code class=\"xref py py-class docutils literal notranslate\">IntegerField</code>, <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BigIntegerField\" title=\"django.db.models.BigIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">BigIntegerField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.DecimalField\" title=\"django.db.models.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\">DecimalField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.FloatField\" title=\"django.db.models.FloatField\"><code class=\"xref py py-class docutils literal notranslate\">FloatField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a>。例如：</p>\n<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><span class=\"kn\">from</span> <span class=\"nn\">psycopg2.extras</span> <span class=\"kn\">import</span> DateTimeTZRange\n<span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    start__contained_by<span class=\"o\">=</span>DateTimeTZRange<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> datetime<span class=\"o\">.</span>timedelta<span class=\"p\">(</span>hours<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">+</span> datetime<span class=\"o\">.</span>timedelta<span class=\"p\">(</span>hours<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>增加了对 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.SmallAutoField\" title=\"django.db.models.SmallAutoField\"><code class=\"xref py py-class docutils literal notranslate\">SmallAutoField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.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>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BigAutoField\" title=\"django.db.models.BigAutoField\"><code class=\"xref py py-class docutils literal notranslate\">BigAutoField</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.SmallIntegerField\" title=\"django.db.models.SmallIntegerField\"><code class=\"xref py py-class docutils literal notranslate\">SmallIntegerField</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.DecimalField\" title=\"django.db.models.DecimalField\"><code class=\"xref py py-class docutils literal notranslate\">DecimalField</code></a> 的支持。</p>\n</aside>\n</section>\n<section id=\"std-fieldlookup-rangefield.overlap\">\n<span id=\"id6\"></span><h5><code class=\"docutils literal notranslate\">overlap</code><a class=\"heading-anchor\" href=\"#std-fieldlookup-rangefield.overlap\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__overlap<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"mi\">12</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;]&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"comparison-functions\">\n<h4>比较函数<a class=\"heading-anchor\" href=\"#comparison-functions\"><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/3.1/ref/models/querysets/#std-fieldlookup-lt\"><code class=\"xref std std-lookup docutils literal notranslate\">lt</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/querysets/#std-fieldlookup-gt\"><code class=\"xref std std-lookup docutils literal notranslate\">gt</code></a>、<a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/querysets/#std-fieldlookup-lte\"><code class=\"xref std std-lookup docutils literal notranslate\">lte</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/querysets/#std-fieldlookup-gte\"><code class=\"xref std std-lookup docutils literal notranslate\">gte</code></a>。这些并没有特别大的帮助——它们先比较下界，然后在必要时才比较上界。这也是用于按范围字段排序的策略。最好是使用特定的范围比较运算符。</p>\n<section id=\"fully-lt\">\n<span id=\"std-fieldlookup-rangefield.fully_lt\"></span><h5><code class=\"docutils literal notranslate\">fully_lt</code><a class=\"heading-anchor\" href=\"#fully-lt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__fully_lt<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">11</span><span class=\"p\">,</span> <span class=\"mi\">15</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"fully-gt\">\n<span id=\"std-fieldlookup-rangefield.fully_gt\"></span><h5><code class=\"docutils literal notranslate\">fully_gt</code><a class=\"heading-anchor\" href=\"#fully-gt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__fully_gt<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">11</span><span class=\"p\">,</span> <span class=\"mi\">15</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Pub trip&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"not-lt\">\n<span id=\"std-fieldlookup-rangefield.not_lt\"></span><h5><code class=\"docutils literal notranslate\">not_lt</code><a class=\"heading-anchor\" href=\"#not-lt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__not_lt<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"mi\">15</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;, &lt;Event: Pub trip&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"not-gt\">\n<span id=\"std-fieldlookup-rangefield.not_gt\"></span><h5><code class=\"docutils literal notranslate\">not_gt</code><a class=\"heading-anchor\" href=\"#not-gt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__not_gt<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"adjacent-to\">\n<span id=\"std-fieldlookup-rangefield.adjacent_to\"></span><h5><code class=\"docutils literal notranslate\">adjacent_to</code><a class=\"heading-anchor\" href=\"#adjacent-to\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\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=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__adjacent_to<span class=\"o\">=</span>NumericRange<span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">21</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;, &lt;Event: Pub trip&gt;]&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"querying-using-the-bounds\">\n<h4>使用边界进行查询<a class=\"heading-anchor\" href=\"#querying-using-the-bounds\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>有三种变换可用于查询。你可以提取下界或上界，或者基于空进行查询。</p>\n<section id=\"startswith\">\n<span id=\"std-fieldlookup-rangefield.startswith\"></span><h5><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></h5>\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=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__startswith<span class=\"o\">=</span><span class=\"mi\">21</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Pub trip&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"endswith\">\n<span id=\"std-fieldlookup-rangefield.endswith\"></span><h5><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></h5>\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=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__endswith<span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"isempty\">\n<span id=\"std-fieldlookup-rangefield.isempty\"></span><h5><code class=\"docutils literal notranslate\">isempty</code><a class=\"heading-anchor\" href=\"#isempty\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>返回的对象是空的范围。可以链到有效的查找 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a>。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__isempty<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"lower-inc\">\n<span id=\"std-fieldlookup-rangefield.lower_inc\"></span><h5><code class=\"docutils literal notranslate\">lower_inc</code><a class=\"heading-anchor\" href=\"#lower-inc\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<aside class=\"version-note version-added\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>根据传递的布尔值，返回具有包含或不包含下界的对象。可以链到有效的查找 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a> 的对象。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__lower_inc<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Soft play&gt;, &lt;Event: Pub trip&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"lower-inf\">\n<span id=\"std-fieldlookup-rangefield.lower_inf\"></span><h5><code class=\"docutils literal notranslate\">lower_inf</code><a class=\"heading-anchor\" href=\"#lower-inf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<aside class=\"version-note version-added\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>根据传递的布尔值，返回具有无界（无限）或仅有下界的对象。可以链到有效的查找 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a>。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__lower_inf<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"upper-inc\">\n<span id=\"std-fieldlookup-rangefield.upper_inc\"></span><h5><code class=\"docutils literal notranslate\">upper_inc</code><a class=\"heading-anchor\" href=\"#upper-inc\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<aside class=\"version-note version-added\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>根据传递的布尔值，返回具有包含或不包含上界的对象。可以链到有效的查找 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a> 的对象。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__upper_inc<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"upper-inf\">\n<span id=\"std-fieldlookup-rangefield.upper_inf\"></span><h5><code class=\"docutils literal notranslate\">upper_inf</code><a class=\"heading-anchor\" href=\"#upper-inf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<aside class=\"version-note version-added\" data-version=\"3.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>根据传递的布尔值，返回具有无界（无限）或仅有上界的对象。可以链到有效的查找 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/models/fields/#django.db.models.BooleanField\" title=\"django.db.models.BooleanField\"><code class=\"xref py py-class docutils literal notranslate\">BooleanField</code></a>。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Event<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>ages__upper_inf<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Event: Pub trip&gt;]&gt;</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"defining-your-own-range-types\">\n<h3>定义自己的范围类型<a class=\"heading-anchor\" href=\"#defining-your-own-range-types\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>PostgreSQL 允许自定义范围类型的定义。Django 的模型和表单字段实现使用下面的基类，psycopg2 提供了一个 <a class=\"reference external\" href=\"https://www.psycopg.org/docs/extras.html#psycopg2.extras.register_range\" title=\"(in Psycopg v2.9)\"><code class=\"xref py py-func docutils literal notranslate\">register_range()</code></a> 来允许使用自定义范围类型。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.RangeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RangeField</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型范围字段的基类。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.RangeField.base_field\">\n<span class=\"sig-name descname\">base_field</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeField.base_field\"><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.contrib.postgres.fields.RangeField.range_type\">\n<span class=\"sig-name descname\">range_type</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeField.range_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>要使用的 psycopg2 范围类型。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.RangeField.form_field\">\n<span class=\"sig-name descname\">form_field</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeField.form_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=\"#django.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField\" title=\"django.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.postgres.forms.BaseRangeField</code></a> 的子类。</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">django.contrib.postgres.forms.</span><span class=\"sig-name descname\">BaseRangeField</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>表范围字段的基类。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField.base_field\">\n<span class=\"sig-name descname\">base_field</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField.base_field\"><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.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField.range_type\">\n<span class=\"sig-name descname\">range_type</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.django.contrib.postgres.forms.BaseRangeField.range_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>要使用的 psycopg2 范围类型。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"range-operators\">\n<h3>范围操作<a class=\"heading-anchor\" href=\"#range-operators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"3.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.0</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.RangeOperators\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RangeOperators</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeOperators\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>PostgreSQL 提供了一组 SQL 运算符，这些运算符可以和范围数据类型一起使用（参见 <a href=\"#id7\"><span class=\"problematic\" id=\"id8\">`PostgreSQL 文档，了解范围运算符的完整细节&lt;https://www.postgresql.org/docs/current/ functions-range.html#RANGE-OPERATORS-TABLE&gt;`_</span></a> ）。这个类的目的是作为一种方便的方法，以避免排版错误。运算符名称与相应的查找名称重叠。</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=\"k\">class</span> <span class=\"nc\">RangeOperators</span><span class=\"p\">:</span>\n    EQUAL <span class=\"o\">=</span> <span class=\"s1\">&#39;=&#39;</span>\n    NOT_EQUAL <span class=\"o\">=</span> <span class=\"s1\">&#39;&lt;&gt;&#39;</span>\n    CONTAINS <span class=\"o\">=</span> <span class=\"s1\">&#39;@&gt;&#39;</span>\n    CONTAINED_BY <span class=\"o\">=</span> <span class=\"s1\">&#39;&lt;@&#39;</span>\n    OVERLAPS <span class=\"o\">=</span> <span class=\"s1\">&#39;&amp;&amp;&#39;</span>\n    FULLY_LT <span class=\"o\">=</span> <span class=\"s1\">&#39;&lt;&lt;&#39;</span>\n    FULLY_GT <span class=\"o\">=</span> <span class=\"s1\">&#39;&gt;&gt;&#39;</span>\n    NOT_LT <span class=\"o\">=</span> <span class=\"s1\">&#39;&amp;&gt;&#39;</span>\n    NOT_GT <span class=\"o\">=</span> <span class=\"s1\">&#39;&amp;&lt;&#39;</span>\n    ADJACENT_TO <span class=\"o\">=</span> <span class=\"s1\">&#39;-|-&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"rangeboundary-expressions\">\n<h3>RangeBoundary() 表达式<a class=\"heading-anchor\" href=\"#rangeboundary-expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"3.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.0</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.RangeBoundary\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RangeBoundary</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">inclusive_lower<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">inclusive_upper<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeBoundary\"><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.contrib.postgres.fields.RangeBoundary.inclusive_lower\">\n<span class=\"sig-name descname\">inclusive_lower</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeBoundary.inclusive_lower\"><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> （默认），则下界为包含 <code class=\"docutils literal notranslate\">'['</code>，否则为不包含 <code class=\"docutils literal notranslate\">'('</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.fields.RangeBoundary.inclusive_upper\">\n<span class=\"sig-name descname\">inclusive_upper</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.fields.RangeBoundary.inclusive_upper\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果 <code class=\"docutils literal notranslate\">False</code> （默认），则上界为包含 <code class=\"docutils literal notranslate\">')'</code>，否则为不包含 <code class=\"docutils literal notranslate\">']'</code>。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\">RangeBoundary()</code> 表达式表示范围边界。它可以与自定义的范围函数一起使用，预期边界，例如定义 <code class=\"xref py py-class docutils literal notranslate\">ExclusionConstraint</code>。完整的细节参见 <a href=\"#id9\"><span class=\"problematic\" id=\"id10\">`PostgreSQL 文档&lt;https://www.postgresql.org/ docs/current/rangetypes.html#RANGETYPES-INCLUSIVITY&gt;`_</span></a> 。</p>\n</section>\n</section>","rootId":"postgresql-specific-model-fields","toc":[{"title":"对这些字段进行索引","anchor":"indexing-these-fields","children":[]},{"title":"ArrayField","anchor":"arrayfield","children":[{"title":"查询 ArrayField","anchor":"querying-arrayfield","children":[{"title":"contains","anchor":"contains","children":[]},{"title":"contained_by","anchor":"contained-by","children":[]},{"title":"overlap","anchor":"overlap","children":[]},{"title":"len","anchor":"len","children":[]},{"title":"索引转换","anchor":"index-transforms","children":[]},{"title":"切片转换","anchor":"slice-transforms","children":[]}]}]},{"title":"CIText 字段","anchor":"citext-fields","children":[]},{"title":"HStoreField","anchor":"hstorefield","children":[{"title":"查询 HStoreField","anchor":"querying-hstorefield","children":[{"title":"键查找","anchor":"key-lookups","children":[]},{"title":"contains","anchor":"std-fieldlookup-hstorefield.contains","children":[]},{"title":"contained_by","anchor":"std-fieldlookup-hstorefield.contained_by","children":[]},{"title":"has_key","anchor":"has-key","children":[]},{"title":"has_any_keys","anchor":"has-any-keys","children":[]},{"title":"has_keys","anchor":"has-keys","children":[]},{"title":"keys","anchor":"keys","children":[]},{"title":"values","anchor":"values","children":[]}]}]},{"title":"JSONField","anchor":"jsonfield","children":[{"title":"查询 JSONField","anchor":"querying-jsonfield","children":[]}]},{"title":"范围字段","anchor":"range-fields","children":[{"title":"IntegerRangeField","anchor":"integerrangefield","children":[]},{"title":"BigIntegerRangeField","anchor":"bigintegerrangefield","children":[]},{"title":"DecimalRangeField","anchor":"decimalrangefield","children":[]},{"title":"DateTimeRangeField","anchor":"datetimerangefield","children":[]},{"title":"DateRangeField","anchor":"daterangefield","children":[]},{"title":"查询范围字段","anchor":"querying-range-fields","children":[{"title":"包含函数","anchor":"containment-functions","children":[{"title":"contains","anchor":"std-fieldlookup-rangefield.contains","children":[]},{"title":"contained_by","anchor":"std-fieldlookup-rangefield.contained_by","children":[]},{"title":"overlap","anchor":"std-fieldlookup-rangefield.overlap","children":[]}]},{"title":"比较函数","anchor":"comparison-functions","children":[{"title":"fully_lt","anchor":"fully-lt","children":[]},{"title":"fully_gt","anchor":"fully-gt","children":[]},{"title":"not_lt","anchor":"not-lt","children":[]},{"title":"not_gt","anchor":"not-gt","children":[]},{"title":"adjacent_to","anchor":"adjacent-to","children":[]}]},{"title":"使用边界进行查询","anchor":"querying-using-the-bounds","children":[{"title":"startswith","anchor":"startswith","children":[]},{"title":"endswith","anchor":"endswith","children":[]},{"title":"isempty","anchor":"isempty","children":[]},{"title":"lower_inc","anchor":"lower-inc","children":[]},{"title":"lower_inf","anchor":"lower-inf","children":[]},{"title":"upper_inc","anchor":"upper-inc","children":[]},{"title":"upper_inf","anchor":"upper-inf","children":[]}]}]},{"title":"定义自己的范围类型","anchor":"defining-your-own-range-types","children":[]},{"title":"范围操作","anchor":"range-operators","children":[]},{"title":"RangeBoundary() 表达式","anchor":"rangeboundary-expressions","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/3.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/3.1/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/zh-hans/3.1/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/constraints","title":"PostgreSQL 特有数据库约束","url":"/zh-hans/3.1/ref/contrib/postgres/constraints/"},"next":{"docname":"ref/contrib/postgres/forms","title":"PostgreSQL 特有表单字段和部件","url":"/zh-hans/3.1/ref/contrib/postgres/forms/"},"formats":{"html":"/zh-hans/3.1/ref/contrib/postgres/fields/","markdown":"/zh-hans/3.1/ref/contrib/postgres/fields.md","json":"/zh-hans/3.1/ref/contrib/postgres/fields.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/ref/contrib/postgres/fields.txt","official":"https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/postgres/fields/","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","pt-br","ko","es","el","pl"]}