{"title":"模型实例参考","version":"6.1","locale":"zh-hans","docname":"ref/models/instances","url":"/zh-hans/6.1/ref/models/instances/","canonical":"https://djangodocs.dev/zh-hans/6.1/ref/models/instances/","summary":"本文档描述了 Model API 的细节。它建立在 模型 和 数据库查询 指南中所介绍的材料基础上，因此，在阅读本文档之前，你可能需要阅读并理解这些文档。 在整个参考资料中，我们将使用在 数据库查询指南 中提出的 示例博客模型 。 创建对象 Link to this heading # 要创建一个新的模型实例，像其他…","html":"<h1>模型实例参考<a class=\"heading-anchor\" href=\"#model-instance-reference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>本文档描述了 <code class=\"docutils literal notranslate\"><span class=\"pre\">Model</span></code> API 的细节。它建立在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/\"><span class=\"doc\">模型</span></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/\"><span class=\"doc\">数据库查询</span></a> 指南中所介绍的材料基础上，因此，在阅读本文档之前，你可能需要阅读并理解这些文档。</p>\n<p>在整个参考资料中，我们将使用在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/\"><span class=\"doc\">数据库查询指南</span></a> 中提出的  <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#queryset-model-example\"><span class=\"std std-ref\">示例博客模型</span></a>。</p>\n<section id=\"creating-objects\">\n<h2>创建对象<a class=\"heading-anchor\" href=\"#creating-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>要创建一个新的模型实例，像其他 Python 类一样实例化它。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Model</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>The keyword arguments are the names of the fields you've defined on your model.\nNote that instantiating a model in no way touches your database; for that, you\nneed to <a class=\"reference internal\" href=\"#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>You may be tempted to customize the model by overriding the <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code>\nmethod. If you do so, however, take care not to change the calling\nsignature as any change may prevent the model instance from being saved.\nAdditionally, referring to model fields within <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> may potentially\nresult in infinite recursion errors in some circumstances. Rather than\noverriding <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code>, try using one of these approaches:</p>\n<ol class=\"arabic\">\n<li><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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n    <span class=\"nd\">@classmethod</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">create</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">title</span><span class=\"p\">):</span>\n        <span class=\"n\">book</span> <span class=\"o\">=</span> <span class=\"bp\">cls</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"n\">title</span><span class=\"p\">)</span>\n        <span class=\"c1\"># do something with the book</span>\n        <span class=\"k\">return</span> <span class=\"n\">book</span>\n\n\n<span class=\"n\">book</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"s2\">&quot;Pride and Prejudice&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>在自定义管理器上添加一个方法（通常首选）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">create_book</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">title</span><span class=\"p\">):</span>\n        <span class=\"n\">book</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"n\">title</span><span class=\"p\">)</span>\n        <span class=\"c1\"># do something with the book</span>\n        <span class=\"k\">return</span> <span class=\"n\">book</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">BookManager</span><span class=\"p\">()</span>\n\n\n<span class=\"n\">book</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create_book</span><span class=\"p\">(</span><span class=\"s2\">&quot;Pride and Prejudice&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n</ol>\n</aside>\n<aside class=\"admonition-setting-attributes-does-not-convert-types admonition\">\n<p class=\"admonition-title\">Setting attributes does not convert types</p>\n<p>Setting a model attribute does not convert the value to the field's Python\ntype. That conversion happens when the model is <a class=\"reference internal\" href=\"#validating-objects\"><span class=\"std std-ref\">validated</span></a>. Although a field assigned a value of a different\ntype (for example, a string assigned to a\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.UUIDField\" title=\"django.db.models.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UUIDField</span></code></a>) may be converted when\n<a class=\"reference internal\" href=\"#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> executes a query, the in-memory instance will keep the\noriginal value until it is <a class=\"reference internal\" href=\"#refreshing-objects\"><span class=\"std std-ref\">reloaded</span></a>.</p>\n</aside>\n<section id=\"customizing-model-loading\">\n<h3>自定义模型加载<a class=\"heading-anchor\" href=\"#customizing-model-loading\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.from_db\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">from_db</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">db</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_names</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">values</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.from_db\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">from_db()</span></code> 方法可以在数据库加载时用于自定义模型实例创建。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">db</span></code> 参数包含模型从数据库加载的数据库别名，<code class=\"docutils literal notranslate\"><span class=\"pre\">field_names</span></code> 包含所有加载字段的名称，<code class=\"docutils literal notranslate\"><span class=\"pre\">values</span></code> 包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">field_names</span></code> 中每个字段的加载值。<code class=\"docutils literal notranslate\"><span class=\"pre\">field_names</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">values</span></code> 的顺序相同。如果模型的所有字段都存在，那么 <code class=\"docutils literal notranslate\"><span class=\"pre\">values</span></code> 就必须按照 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 预期的顺序。也就是说，实例可以通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">cls(*values)</span></code> 来创建。如果有任何字段被推迟，它们将不会出现在 <code class=\"docutils literal notranslate\"><span class=\"pre\">field_names</span></code> 中。在这种情况下，给每个缺失的字段分配一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.DEFERRED</span></code> 的值。</p>\n<p>除了创建新的模型外，<code class=\"docutils literal notranslate\"><span class=\"pre\">from_db()</span></code> 方法必须在新实例的 <a class=\"reference internal\" href=\"#django.db.models.Model._state\" title=\"django.db.models.Model._state\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_state</span></code></a> 属性中设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">adding</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">db</span></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=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">DEFERRED</span>\n\n\n<span class=\"nd\">@classmethod</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">from_db</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"n\">db</span><span class=\"p\">,</span> <span class=\"n\">field_names</span><span class=\"p\">,</span> <span class=\"n\">values</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Default implementation of from_db() (subject to change and could</span>\n    <span class=\"c1\"># be replaced with super()).</span>\n    <span class=\"k\">if</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">concrete_fields</span><span class=\"p\">):</span>\n        <span class=\"n\">values</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"p\">)</span>\n        <span class=\"n\">values</span><span class=\"o\">.</span><span class=\"n\">reverse</span><span class=\"p\">()</span>\n        <span class=\"n\">values</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">values</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">attname</span> <span class=\"ow\">in</span> <span class=\"n\">field_names</span> <span class=\"k\">else</span> <span class=\"n\">DEFERRED</span>\n            <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"bp\">cls</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">concrete_fields</span>\n        <span class=\"p\">]</span>\n    <span class=\"n\">instance</span> <span class=\"o\">=</span> <span class=\"bp\">cls</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">values</span><span class=\"p\">)</span>\n    <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">_state</span><span class=\"o\">.</span><span class=\"n\">adding</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">_state</span><span class=\"o\">.</span><span class=\"n\">db</span> <span class=\"o\">=</span> <span class=\"n\">db</span>\n    <span class=\"c1\"># customization to store the original field values on the instance</span>\n    <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">_loaded_values</span> <span class=\"o\">=</span> <span class=\"nb\">dict</span><span class=\"p\">(</span>\n        <span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">field_names</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">value</span> <span class=\"k\">for</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">values</span> <span class=\"k\">if</span> <span class=\"n\">value</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"n\">DEFERRED</span><span class=\"p\">))</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">instance</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">save</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Check how the current values differ from ._loaded_values. For example,</span>\n    <span class=\"c1\"># prevent changing the creator_id of the model. (This example doesn&#39;t</span>\n    <span class=\"c1\"># support cases where &#39;creator_id&#39; is deferred).</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_state</span><span class=\"o\">.</span><span class=\"n\">adding</span> <span class=\"ow\">and</span> <span class=\"p\">(</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">creator_id</span> <span class=\"o\">!=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_loaded_values</span><span class=\"p\">[</span><span class=\"s2\">&quot;creator_id&quot;</span><span class=\"p\">]</span>\n    <span class=\"p\">):</span>\n        <span class=\"k\">raise</span> <span class=\"ne\">ValueError</span><span class=\"p\">(</span><span class=\"s2\">&quot;Updating the value of creator isn&#39;t allowed&quot;</span><span class=\"p\">)</span>\n    <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>上面的例子显示了一个完整的 <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db()</span></code> 实现，以说明如何做到这一点。在这种情况下，可以在 <code class=\"docutils literal notranslate\"><span class=\"pre\">from_db()</span></code> 方法中使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> 调用。</p>\n</section>\n</section>\n<section id=\"refreshing-objects-from-database\">\n<span id=\"refreshing-objects\"></span><h2>从数据库中刷新对象<a class=\"heading-anchor\" href=\"#refreshing-objects-from-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>如果从模型实例中删除一个字段，再次访问它会重新从数据库加载该值：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">first</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">del</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">field</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">field</span>  <span class=\"c1\"># Loads the field from the database</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.refresh_from_db\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">refresh_from_db</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">from_queryset</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.refresh_from_db\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.arefresh_from_db\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">arefresh_from_db</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">from_queryset</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.arefresh_from_db\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">arefresh_from_db()</span></code></p>\n<p>如果你需要从数据库中重新加载一个模型的值，你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">refresh_from_db()</span></code> 方法。当这个方法被调用时，没有参数时，会做以下工作：</p>\n<ol class=\"arabic simple\">\n<li><p>模型的所有非递延字段都更新为数据库中当前的值。</p></li>\n<li><p>任何缓存的关系都会从重新加载的实例中清除。</p></li>\n</ol>\n<p>只有模型的字段会从数据库中重载。其他依赖于数据库的值，如注释，不会被重载。任何 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/utils/#django.utils.functional.cached_property\" title=\"django.utils.functional.cached_property\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">&#64;cached_property</span></code></a> 属性也不会被清除。</p>\n<p>重载发生在实例被加载的数据库中，如果实例不是从数据库中加载的，则从默认数据库中加载。<code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> 参数可以用来强制使用数据库进行重载。</p>\n<p>可以通过使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> 参数强制加载一组字段。</p>\n<p>例如，为了测试 <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> 的调用是否导致了预期的更新，你可以写一个类似这样的测试：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_update_result</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">val</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">val</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;val&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"c1\"># At this point obj.val is still 1, but the value in the database</span>\n    <span class=\"c1\"># was updated to 2. The object&#39;s updated value needs to be reloaded</span>\n    <span class=\"c1\"># from the database.</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">refresh_from_db</span><span class=\"p\">()</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">val</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>When a deferred field is loaded on-demand for a single model instance, the\nloading happens through this method. Thus it is possible to customize the way\nthis loading happens. The example below shows how one can reload all of the\ninstance's fields when a deferred field is loaded on-demand:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ExampleModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">refresh_from_db</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">using</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"c1\"># fields contains the name of the deferred field to be</span>\n        <span class=\"c1\"># loaded.</span>\n        <span class=\"k\">if</span> <span class=\"n\">fields</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">(</span><span class=\"n\">fields</span><span class=\"p\">)</span>\n            <span class=\"n\">deferred_fields</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_deferred_fields</span><span class=\"p\">()</span>\n            <span class=\"c1\"># If any deferred field is going to be loaded</span>\n            <span class=\"k\">if</span> <span class=\"n\">fields</span><span class=\"o\">.</span><span class=\"n\">intersection</span><span class=\"p\">(</span><span class=\"n\">deferred_fields</span><span class=\"p\">):</span>\n                <span class=\"c1\"># then load all of them</span>\n                <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"n\">fields</span><span class=\"o\">.</span><span class=\"n\">union</span><span class=\"p\">(</span><span class=\"n\">deferred_fields</span><span class=\"p\">)</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">refresh_from_db</span><span class=\"p\">(</span><span class=\"n\">using</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">from_queryset</span></code> 参数允许使用不同于从 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/managers/#django.db.models.Model._base_manager\" title=\"django.db.models.Model._base_manager\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">_base_manager</span></code></a> 创建的查询集。它让你对模型的重新加载方式有更多的控制。例如，当你的模型使用软删除时，你可以让 <code class=\"docutils literal notranslate\"><span class=\"pre\">refresh_from_db()</span></code> 考虑到这一点：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">refresh_from_db</span><span class=\"p\">(</span><span class=\"n\">from_queryset</span><span class=\"o\">=</span><span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">active_objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>你可以缓存相关对象，否则这些对象将从重新加载的实例中清除：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">refresh_from_db</span><span class=\"p\">(</span><span class=\"n\">from_queryset</span><span class=\"o\">=</span><span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;related_field&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>你可以在重新加载模型值之前锁定该行直到事务结束：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">refresh_from_db</span><span class=\"p\">(</span><span class=\"n\">from_queryset</span><span class=\"o\">=</span><span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">())</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.get_deferred_fields\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_deferred_fields</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.get_deferred_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>一个辅助方法，返回一个包含当前这个模型的所有这些字段的属性名的集合。</p>\n</section>\n<section id=\"validating-objects\">\n<span id=\"id1\"></span><h2>验证对象<a class=\"heading-anchor\" href=\"#validating-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>验证模型涉及四个步骤：</p>\n<ol class=\"arabic simple\">\n<li><p>Validate the model fields - <a class=\"reference internal\" href=\"#django.db.models.Model.clean_fields\" title=\"django.db.models.Model.clean_fields\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.clean_fields()</span></code></a></p></li>\n<li><p>Validate the model as a whole - <a class=\"reference internal\" href=\"#django.db.models.Model.clean\" title=\"django.db.models.Model.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.clean()</span></code></a></p></li>\n<li><p>Validate the field uniqueness - <a class=\"reference internal\" href=\"#django.db.models.Model.validate_unique\" title=\"django.db.models.Model.validate_unique\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.validate_unique()</span></code></a></p></li>\n<li><p>验证约束 - <a class=\"reference internal\" href=\"#django.db.models.Model.validate_constraints\" title=\"django.db.models.Model.validate_constraints\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.validate_constraints()</span></code></a></p></li>\n</ol>\n<p>当你调用模型的 <a class=\"reference internal\" href=\"#django.db.models.Model.full_clean\" title=\"django.db.models.Model.full_clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code></a> 方法时，会执行所有四个步骤。</p>\n<p>When you use a <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a>, the call to\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/api/#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code></a> will perform these validation steps for\nall the fields that are included on the form. See the <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/\"><span class=\"doc\">ModelForm\ndocumentation</span></a> for more information. You should only\nneed to call a model's <a class=\"reference internal\" href=\"#django.db.models.Model.full_clean\" title=\"django.db.models.Model.full_clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code></a> method if you plan to handle\nvalidation errors yourself, or if you have excluded fields from the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a> that require validation.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.full_clean\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">full_clean</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exclude</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">validate_unique</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">validate_constraints</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.full_clean\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>This method calls <a class=\"reference internal\" href=\"#django.db.models.Model.clean_fields\" title=\"django.db.models.Model.clean_fields\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.clean_fields()</span></code></a>, <a class=\"reference internal\" href=\"#django.db.models.Model.clean\" title=\"django.db.models.Model.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.clean()</span></code></a>,\n<a class=\"reference internal\" href=\"#django.db.models.Model.validate_unique\" title=\"django.db.models.Model.validate_unique\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.validate_unique()</span></code></a> (if <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_unique</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>),  and\n<a class=\"reference internal\" href=\"#django.db.models.Model.validate_constraints\" title=\"django.db.models.Model.validate_constraints\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.validate_constraints()</span></code></a> (if <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_constraints</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>)\nin that order and raises a <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a> that\nhas a <code class=\"docutils literal notranslate\"><span class=\"pre\">message_dict</span></code> attribute containing errors from all four stages.</p>\n<p>可选的 <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> 参数可以用来提供一个字段名称的 <code class=\"docutils literal notranslate\"><span class=\"pre\">set</span></code>，可以从验证和清理中排除。 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a> 使用这个参数来排除在表单上不存在的字段，因为用户无法纠正引发的任何错误。</p>\n<p>Note that <code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> will <em>not</em> be called automatically when you call\nyour model's <a class=\"reference internal\" href=\"#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> method. You'll need to call it manually\nwhen you want to run one-step model validation for your own manually created\nmodels. 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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">article</span><span class=\"o\">.</span><span class=\"n\">full_clean</span><span class=\"p\">()</span>\n<span class=\"k\">except</span> <span class=\"n\">ValidationError</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Do something based on the errors contained in e.message_dict.</span>\n    <span class=\"c1\"># Display them to a user, or handle them programmatically.</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> 执行的第一步是清理每个单独的字段。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.clean_fields\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">clean_fields</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exclude</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.clean_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>该方法将验证模型上的所有字段。可选的 <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> 参数允许您提供一个字段名称的 <code class=\"docutils literal notranslate\"><span class=\"pre\">set</span></code>，以排除验证。如果任何字段未通过验证，它将引发 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a>。</p>\n<p>The second step <code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> performs is to call <a class=\"reference internal\" href=\"#django.db.models.Model.clean\" title=\"django.db.models.Model.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.clean()</span></code></a>.\nThis method should be overridden to perform custom validation on your model.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.clean\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">clean</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.clean\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>这个方法应该用来提供自定义模型验证，如果需要的话，还可以修改模型上的属性。例如，你可以使用它来自动为一个字段提供一个值，或进行需要访问多个字段的验证：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Don&#39;t allow draft entries to have a pub_date.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">status</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;draft&quot;</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Draft entries may not have a publication date.&quot;</span><span class=\"p\">))</span>\n        <span class=\"c1\"># Set the pub_date for published items if it hasn&#39;t been set already.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">status</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;published&quot;</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Note, however, that like <a class=\"reference internal\" href=\"#django.db.models.Model.full_clean\" title=\"django.db.models.Model.full_clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.full_clean()</span></code></a>, a model's <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code>\nmethod is not invoked when you call your model's <a class=\"reference internal\" href=\"#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> method.</p>\n<p>在上面的例子中，由 <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.clean()</span></code> 引发的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a> 异常是用字符串实例化的，所以它将被存储在一个特殊的错误字典键中， <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.NON_FIELD_ERRORS\" title=\"django.core.exceptions.NON_FIELD_ERRORS\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">NON_FIELD_ERRORS</span></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=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">NON_FIELD_ERRORS</span><span class=\"p\">,</span> <span class=\"n\">ValidationError</span>\n\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">article</span><span class=\"o\">.</span><span class=\"n\">full_clean</span><span class=\"p\">()</span>\n<span class=\"k\">except</span> <span class=\"n\">ValidationError</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span>\n    <span class=\"n\">non_field_errors</span> <span class=\"o\">=</span> <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">message_dict</span><span class=\"p\">[</span><span class=\"n\">NON_FIELD_ERRORS</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>要将异常分配给一个特定的字段，用一个字典实例化 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a>，其中键是字段名。我们可以更新前面的例子，将错误分配给 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Don&#39;t allow draft entries to have a pub_date.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">status</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;draft&quot;</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n                <span class=\"p\">{</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Draft entries may not have a publication date.&quot;</span><span class=\"p\">)}</span>\n            <span class=\"p\">)</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>如果你在 <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.clean()</span></code> 期间检测到多个字段的错误，你也可以传递一个字段名与错误映射的字典：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n    <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">:</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Missing title.&quot;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;required&quot;</span><span class=\"p\">),</span>\n        <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">:</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Invalid date.&quot;</span><span class=\"p\">),</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;invalid&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>接下来，<code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> 将检查模型上的唯一约束。</p>\n<aside class=\"admonition-how-to-raise-field-specific-validation-errors-if-those-fields-don-t-appear-in-a-modelform admonition\">\n<p class=\"admonition-title\">如果字段没有出现在 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code> 中，如何引发特定字段的验证错误。</p>\n<p>你不能在 <code class=\"docutils literal notranslate\"><span class=\"pre\">Model.clean()</span></code> 中对没有出现在模型表单中的字段提出验证错误（一个表单可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.field</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.exclude</span></code> 来限制它的字段）。这样做会引发一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code>，因为验证错误将无法与被排除的字段相关联。</p>\n<p>为了解决这个难题，可以覆盖 <a class=\"reference internal\" href=\"#django.db.models.Model.clean_fields\" title=\"django.db.models.Model.clean_fields\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.clean_fields()</span></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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">clean_fields</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">exclude</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">clean_fields</span><span class=\"p\">(</span><span class=\"n\">exclude</span><span class=\"o\">=</span><span class=\"n\">exclude</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">status</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;draft&quot;</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"k\">if</span> <span class=\"n\">exclude</span> <span class=\"ow\">and</span> <span class=\"s2\">&quot;status&quot;</span> <span class=\"ow\">in</span> <span class=\"n\">exclude</span><span class=\"p\">:</span>\n                <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n                    <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Draft entries may not have a publication date.&quot;</span><span class=\"p\">)</span>\n                <span class=\"p\">)</span>\n            <span class=\"k\">else</span><span class=\"p\">:</span>\n                <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n                    <span class=\"p\">{</span>\n                        <span class=\"s2\">&quot;status&quot;</span><span class=\"p\">:</span> <span class=\"n\">_</span><span class=\"p\">(</span>\n                            <span class=\"s2\">&quot;Set status to draft if there is not a publication date.&quot;</span>\n                        <span class=\"p\">),</span>\n                    <span class=\"p\">}</span>\n                <span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.validate_unique\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">validate_unique</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exclude</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.validate_unique\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>这个方法类似于 <a class=\"reference internal\" href=\"#django.db.models.Model.clean_fields\" title=\"django.db.models.Model.clean_fields\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clean_fields()</span></code></a>，但是验证模型上定义的唯一约束，而不是单个字段的值，这些约束通过 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.unique</span></code></a>、<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.unique_for_date\" title=\"django.db.models.Field.unique_for_date\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.unique_for_date</span></code></a>、<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.unique_for_month\" title=\"django.db.models.Field.unique_for_month\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.unique_for_month</span></code></a>、<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.unique_for_year\" title=\"django.db.models.Field.unique_for_year\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.unique_for_year</span></code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.unique_together</span></code></a> 来定义。可选的 <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> 参数允许您提供一个字段名称的 <code class=\"docutils literal notranslate\"><span class=\"pre\">set</span></code>，以排除验证。如果任何字段未通过验证，它将引发 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a>。</p>\n<p>在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.constraints</span></code></a> 中定义的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/constraints/#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UniqueConstraint</span></code></a> 由 <a class=\"reference internal\" href=\"#django.db.models.Model.validate_constraints\" title=\"django.db.models.Model.validate_constraints\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.validate_constraints()</span></code></a> 进行验证。</p>\n<p>请注意，如果你为 <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_unique()</span></code> 提供了一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> 参数，任何涉及你提供的一个字段的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_together</span></code></a> 约束将不会被检查。</p>\n<p>最后，<code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> 将检查模型上的任何其他约束。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.validate_constraints\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">validate_constraints</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exclude</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.validate_constraints\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>这个方法验证了在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.constraints</span></code></a> 中定义的所有约束。可选的 <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude</span></code> 参数允许您提供一个字段名称的 <code class=\"docutils literal notranslate\"><span class=\"pre\">set</span></code>，以排除验证。如果任何约束未通过验证，它将引发 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a>。</p>\n</section>\n<section id=\"saving-objects\">\n<h2>保存对象<a class=\"heading-anchor\" href=\"#saving-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>要将对象保存回数据库，调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>：</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.save\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">save</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">force_insert</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">force_update</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_DB_ALIAS</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">update_fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.save\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.asave\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">asave</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">force_insert</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">force_update</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_DB_ALIAS</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">update_fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.asave\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">asave()</span></code></p>\n<p>关于使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">force_insert</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">force_update</span></code> 参数的细节，见 <a class=\"reference internal\" href=\"#ref-models-force-insert\"><span class=\"std std-ref\">强制执行 INSERT 或 UPDATE</span></a> 。关于 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 参数的细节可以在 <a class=\"reference internal\" href=\"#ref-models-update-fields\"><span class=\"std std-ref\">指定要保存的字段</span></a> 部分找到。</p>\n<p>如果你想自定义保存行为，你可以覆盖这个 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#overriding-model-methods\"><span class=\"std std-ref\">重写之前定义的模型方法</span></a>。</p>\n<p>模型保存过程也有一些微妙的地方，请看下面的章节。</p>\n<section id=\"auto-incrementing-primary-keys\">\n<h3>自增主键<a class=\"heading-anchor\" href=\"#auto-incrementing-primary-keys\"><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/6.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a> — 一个自增的主键 — 那么在第一次调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 时，自增的值将被计算并保存为对象的属性：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b2</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Cheddar Talk&quot;</span><span class=\"p\">,</span> <span class=\"n\">tagline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Thoughts on cheese.&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b2</span><span class=\"o\">.</span><span class=\"n\">id</span>  <span class=\"c1\"># Returns None, because b2 doesn&#39;t have an ID yet.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b2</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b2</span><span class=\"o\">.</span><span class=\"n\">id</span>  <span class=\"c1\"># Returns the ID of your new object.</span>\n</code></pre></div>\n<p>在你调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 之前，没有办法知道一个 ID 的值是多少，因为这个值是由你的数据库计算出来的，而不是由 Django 计算出来的。</p>\n<p>为了方便起见，每个模型都有一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a> 默认命名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>，除非你在模型中的字段上明确指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">primary_key=True</span></code>。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a> 的文档。</p>\n<section id=\"the-pk-property\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code> 属性<a class=\"heading-anchor\" href=\"#the-pk-property\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.pk\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">pk</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model.pk\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Regardless of whether you define a primary key field yourself, or let Django\nsupply one for you, each model will have a property called <code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code>. It behaves\nlike a normal attribute on the model, but is actually an alias for whichever\nfield or fields compose the primary key for the model. You can read and set\nthis value, just as you would for any other attribute, and it will update the\ncorrect fields in the model.</p>\n</section>\n<section id=\"explicitly-specifying-auto-primary-key-values\">\n<h4>明确指定自动主键值<a class=\"heading-anchor\" href=\"#explicitly-specifying-auto-primary-key-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>如果模型具有 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a>，但你想在保存时明确地定义新对象的 ID，请在保存之前明确定义它，而不是依赖于自动分配的 ID：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b3</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Cheddar Talk&quot;</span><span class=\"p\">,</span> <span class=\"n\">tagline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Thoughts on cheese.&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b3</span><span class=\"o\">.</span><span class=\"n\">id</span>  <span class=\"c1\"># Returns 3.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b3</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b3</span><span class=\"o\">.</span><span class=\"n\">id</span>  <span class=\"c1\"># Returns 3.</span>\n</code></pre></div>\n<p>如果你手动分配自动主键值，请确保不要使用一个已经存在的主键值！如果你创建一个新的对象，并使用一个已经存在于数据库中的显式主键值，Django 会认为你是在改变现有的记录，而不是创建一个新的记录。</p>\n<p>考虑到上面的 <code class=\"docutils literal notranslate\"><span class=\"pre\">'Cheddar</span> <span class=\"pre\">Talk'</span></code> 博客的例子，这个例子将覆盖数据库中以前的记录：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">b4</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Not Cheddar&quot;</span><span class=\"p\">,</span> <span class=\"n\">tagline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Anything but cheese.&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">b4</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>  <span class=\"c1\"># Overrides the previous blog with ID=3!</span>\n</code></pre></div>\n<p>发生这种情况的原因，请看下面 <a class=\"reference internal\" href=\"#how-django-knows-to-update-vs-insert\">How Django knows to UPDATE vs. INSERT</a> 。</p>\n<p>明确指定自动主键值主要用于批量保存对象，当你确信不会发生主键碰撞时。</p>\n<p>如果你使用的是 PostgreSQL，与主键相关的序列可能需要更新；参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/databases/#manually-specified-autoincrement-pk\"><span class=\"std std-ref\">手动指定自增主键的值。</span></a>。</p>\n</section>\n</section>\n<section id=\"what-happens-when-you-save\">\n<h3>保存时会发生什么？<a class=\"heading-anchor\" href=\"#what-happens-when-you-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>当你保存一个对象时，Django 会执行以下步骤：</p>\n<ol class=\"arabic\">\n<li><p><strong>发送一个预保存信号。</strong> <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a> 信号被发送，允许任何监听该信号的函数做一些事情。</p></li>\n<li><p><strong>预处理数据。</strong> 每个字段的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.pre_save\" title=\"django.db.models.Field.pre_save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">pre_save()</span></code></a> 方法被调用来执行任何需要的自动数据修改。例如，日期／时间字段重写了 <code class=\"docutils literal notranslate\"><span class=\"pre\">pre_save()</span></code> 来实现 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.DateField.auto_now_add\" title=\"django.db.models.DateField.auto_now_add\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now_add</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.DateField.auto_now\" title=\"django.db.models.DateField.auto_now\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">auto_now</span></code></a>。</p></li>\n<li><p><strong>为数据库准备数据。</strong> 要求每个字段的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.get_db_prep_save\" title=\"django.db.models.Field.get_db_prep_save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_db_prep_save()</span></code></a> 方法提供其当前的值，数据类型可以写入数据库。</p>\n<p>大多数字段不需要数据准备。简单的数据类型，如整数和字符串，作为一个 Python 对象是“可以写入”的。然而，更复杂的数据类型通常需要一些修改。</p>\n<p>例如，<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a> 字段使用 Python <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> 对象来存储数据。数据库不存储 <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code> 对象，所以字段值必须转换成符合 ISO 标准的日期字符串才能插入数据库。</p>\n</li>\n<li><p><strong>将数据插入数据库。</strong> 将预先处理、准备好的数据组成 SQL 语句，以便插入数据库。</p></li>\n<li><p><strong>发送一个保存后的信号。</strong> <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> 信号被发送，允许任何监听该信号的函数做一些事情。</p></li>\n</ol>\n</section>\n<section id=\"how-django-knows-to-update-vs-insert\">\n<h3>Django 是如何知道 UPDATE 与 INSERT 的？<a class=\"heading-anchor\" href=\"#how-django-knows-to-update-vs-insert\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>你可能已经注意到，Django 数据库对象使用相同的 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法来创建和修改对象。Django 封装了使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code> SQL 语句的需求。具体来说，当你调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 并且对象的主键属性 <strong>不</strong> 定义 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.db_default\" title=\"django.db.models.Field.db_default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_default</span></code></a> 时，Django 遵循以下算法：</p>\n<ul class=\"simple\">\n<li><p>If the object's primary key attribute is set to anything except <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>,\nDjango executes an <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>.</p></li>\n<li><p>如果对象的主键属性没有设置，或者 <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code> 没有更新任何东西（例如主键被设置为数据库中不存在的值），Django 会执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code>。</p></li>\n</ul>\n<p>如果对象的主键属性定义了 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">default</span></code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.db_default\" title=\"django.db.models.Field.db_default\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_default</span></code></a>，那么如果它是一个现有的模型实例并且主键设置为数据库中存在的值，Django 将执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>。否则，Django 将执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code>。</p>\n<p>这里的一个问题是，如果你不能保证主键值未被使用，那么在保存新对象时，你应该注意不要显式地指定一个主键值。关于这个细微的差别，请看上面的 <a class=\"reference internal\" href=\"#explicitly-specifying-auto-primary-key-values\">Explicitly specifying auto-primary-key values</a> 和下面的 <a class=\"reference internal\" href=\"#forcing-an-insert-or-update\">Forcing an INSERT or UPDATE</a> 。</p>\n<p>在 Django 1.5 和更早的版本中，当主键属性被设置时，Django 执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code>。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 找到了一条记录，那么 Django 就会进行 <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>，否则就会进行 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code>。老算法的结果是在 <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code> 的情况下多了一个查询。在一些罕见的情况下，即使数据库中包含了一条对象主键值的记录，数据库也不会报告某行被更新。一个例子是 PostgreSQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ON</span> <span class=\"pre\">UPDATE</span></code> 触发器，它返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code>。在这种情况下，可以通过将 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.select_on_save\" title=\"django.db.models.Options.select_on_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">select_on_save</span></code></a> 选项设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 来恢复到旧算法。</p>\n<section id=\"forcing-an-insert-or-update\">\n<span id=\"ref-models-force-insert\"></span><h4>强制执行 INSERT 或 UPDATE<a class=\"heading-anchor\" href=\"#forcing-an-insert-or-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>In some rare circumstances, it's necessary to be able to force the\n<a class=\"reference internal\" href=\"#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> method to perform an SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> and not fall back to\ndoing an <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>. Or vice-versa: update, if possible, but not insert a new\nrow. In these cases you can pass the <code class=\"docutils literal notranslate\"><span class=\"pre\">force_insert=True</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">force_update=True</span></code> parameters to the <a class=\"reference internal\" href=\"#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> method.\nPassing both parameters is an error: you cannot both insert <em>and</em> update at the\nsame time!</p>\n<p>在使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">多表继承</span></a> 时，也可以提供一个父类的元组给 <code class=\"docutils literal notranslate\"><span class=\"pre\">force_insert</span></code>，以强制为每个基类执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> 语句。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Restaurant</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bob&#39;s Cafe&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">force_insert</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">Place</span><span class=\"p\">,))</span>\n\n<span class=\"n\">Restaurant</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bob&#39;s Cafe&quot;</span><span class=\"p\">,</span> <span class=\"n\">rating</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">force_insert</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">Place</span><span class=\"p\">,</span> <span class=\"n\">Rating</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>你可以传递 <code class=\"docutils literal notranslate\"><span class=\"pre\">force_insert=(models.Model,)</span></code> 来强制执行所有父类的 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> 语句。默认情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">force_insert=True</span></code> 只会强制为当前模型插入新行。</p>\n<aside class=\"version-note version-changed\" data-version=\"6.0\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>When a forced update does not affect any rows a\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/class/#django.db.models.Model.NotUpdated\" title=\"django.db.models.Model.NotUpdated\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotUpdated</span></code></a> exception is raised. On previous\nversions a generic <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.db.DatabaseError\" title=\"django.db.DatabaseError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">django.db.DatabaseError</span></code></a> was raised.</p>\n</aside>\n<p>你应该很少需要使用这些参数。Django 几乎总是会做正确的事情，试图覆盖会导致难以追踪的错误。这个功能只适合进阶使用。</p>\n<p>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 将强制更新，类似于 <code class=\"docutils literal notranslate\"><span class=\"pre\">force_update</span></code>。</p>\n</section>\n</section>\n<section id=\"updating-attributes-based-on-existing-fields\">\n<span id=\"ref-models-field-updates-using-f-expressions\"></span><h3>基于现有字段更新属性<a class=\"heading-anchor\" href=\"#updating-attributes-based-on-existing-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>有时候你需要对字段执行简单的算术操作，比如增加或减少当前值。实现这一目标的一种方法是在 Python 中进行算术操作，比如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">product</span> <span class=\"o\">=</span> <span class=\"n\">Product</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Venezuelan Beaver Cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">product</span><span class=\"o\">.</span><span class=\"n\">number_sold</span> <span class=\"o\">+=</span> <span class=\"mi\">1</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">product</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>如果从数据库中检索到的 <code class=\"docutils literal notranslate\"><span class=\"pre\">number_sold</span></code> 旧值是 10，那么 11 的值将被写回数据库。</p>\n<p>The process can be made robust, <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#avoiding-race-conditions-using-f\"><span class=\"std std-ref\">avoiding a race condition</span></a>, as well as slightly faster by expressing\nthe update relative to the original field value, rather than as an explicit\nassignment of a new value. Django provides <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#f-expressions\"><span class=\"std std-ref\">F() 表达式</span></a> for performing\nthis kind of relative update. Using <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#f-expressions\"><span class=\"std std-ref\">F() 表达式</span></a>, the previous example\nis expressed as:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">product</span> <span class=\"o\">=</span> <span class=\"n\">Product</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Venezuelan Beaver Cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">product</span><span class=\"o\">.</span><span class=\"n\">number_sold</span> <span class=\"o\">=</span> <span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;number_sold&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">product</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>For more details, see the documentation on <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#f-expressions\"><span class=\"std std-ref\">F() 表达式</span></a> and their\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#topics-db-queries-update\"><span class=\"std std-ref\">use in update queries</span></a>.</p>\n</section>\n<section id=\"specifying-which-fields-to-save\">\n<span id=\"ref-models-update-fields\"></span><h3>指定要保存的字段<a class=\"heading-anchor\" href=\"#specifying-which-fields-to-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 在关键字参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 中传递了一个字段名列表，那么只有列表中命名的字段才会被更新。如果你只想更新一个对象上的一个或几个字段，这可能是可取的。防止数据库中所有的模型字段被更新会有轻微的性能优势。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">product</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Name changed again&quot;</span>\n<span class=\"n\">product</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">update_fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 参数可以是任何包含字符串的可迭代对象。一个空的 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 可迭代对象将跳过保存。值为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> 将对所有字段进行更新。</p>\n<p>指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 将强制更新。</p>\n<p>When saving a model fetched through deferred model loading\n(<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a> or\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a>) only the fields loaded\nfrom the DB will get updated. In effect there is an automatic\n<code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> in this case. If you assign or change any deferred field\nvalue, the field will be added to the updated fields.</p>\n<aside class=\"admonition-field-pre-save-and-update-fields admonition\">\n<p class=\"admonition-title\">Field.pre_save()` 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code></p>\n<p>如果传递了 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code>，则只会调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.Field.pre_save\" title=\"django.db.models.Field.pre_save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">pre_save()</span></code></a> 方法。例如，这意味着具有 <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_now=True</span></code> 的日期/时间字段将不会被更新，除非它们包含在 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 中。</p>\n</aside>\n</section>\n</section>\n<section id=\"deleting-objects\">\n<h2>删除对象<a class=\"heading-anchor\" href=\"#deleting-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.delete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">delete</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_DB_ALIAS</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keep_parents</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.delete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.adelete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">adelete</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_DB_ALIAS</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keep_parents</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.adelete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">adelete()</span></code></p>\n<p>Issues an SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code> for the object. This only deletes the object in the\ndatabase; the Python instance will still exist and will still have data in\nits fields, except for the primary key set to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. This method returns the\nnumber of objects deleted and a dictionary with the number of deletions per\nobject type. The return value will count instances from related models if\nDjango is emulating cascade behavior via Python <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">on_delete</span></code></a>\nvariants. Otherwise, for database variants such as\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.DB_CASCADE\" title=\"django.db.models.DB_CASCADE\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">DB_CASCADE</span></code></a>, the return value will report only\ninstances of the <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a>'s model.</p>\n<p>更多细节，包括如何批量删除对象，请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/#topics-db-queries-delete\"><span class=\"std std-ref\">删除对象</span></a>。</p>\n<p>如果你想自定义删除行为，你可以覆盖 <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> 方法。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#overriding-model-methods\"><span class=\"std std-ref\">重写之前定义的模型方法</span></a>。</p>\n<p>有时，在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">多表继承</span></a> 中，你可能只想删除子模型的数据，指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">keep_parents=True</span></code> 将保留父模型的数据。指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">keep_parents=True</span></code> 将保留父模型的数据。</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>Support for the <code class=\"docutils literal notranslate\"><span class=\"pre\">DB_*</span></code> variants of <code class=\"docutils literal notranslate\"><span class=\"pre\">on_delete</span></code> attribute was added.</p>\n</aside>\n</section>\n<section id=\"pickling-objects\">\n<h2>Pickle 序列化对象<a class=\"heading-anchor\" href=\"#pickling-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>当你 <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pickle</span></code></a> 一个模型时，它的当前状态被序列化。当你反序列化时，它将包含它被序列化时的模型实例，而不是当前数据库中的数据。</p>\n<aside class=\"admonition-you-can-t-share-pickles-between-versions admonition\">\n<p class=\"admonition-title\">你不能在不同版本之间共享 pickle</p>\n<p>模型的 pickle 只对生成它们的 Django 版本有效。如果你使用 Django 版本 N 生成了一个 pickle，那么不能保证这个 pickle 在 Django 版本 N+1 中可以被读取。Pickle 不应该作为长期存档策略的一部分。</p>\n<p>由于 pickle 兼容性错误可能很难诊断，比如静默损坏对象，所以当你试图在 Django 版本中反序列化模型时，会发出 <code class=\"docutils literal notranslate\"><span class=\"pre\">RuntimeWarning</span></code> 的警告。</p>\n</aside>\n</section>\n<section id=\"other-model-instance-methods\">\n<span id=\"model-instance-methods\"></span><h2>其他模型实例方法<a class=\"heading-anchor\" href=\"#other-model-instance-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>有几个对象方法有特殊用途。</p>\n<section id=\"str\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code><a class=\"heading-anchor\" href=\"#str\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.__str__\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">__str__</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.__str__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>每当你对一个对象调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> 时，就会调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> 方法。Django 在很多地方使用了 <code class=\"docutils literal notranslate\"><span class=\"pre\">str(obj)</span></code> 方法。最主要的是，在 Django 管理站点中显示一个对象，以及作为模板显示对象时插入的值。因此，你应该总是从 <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </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=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">first_name</span><span class=\"si\">}</span><span class=\"s2\"> </span><span class=\"si\">{</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">last_name</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span>\n</code></pre></div>\n</section>\n<section id=\"eq\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">__eq__()</span></code><a class=\"heading-anchor\" href=\"#eq\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.__eq__\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">__eq__</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.__eq__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>相等方法的定义是，具有相同主键值和相同具体类的实例被认为是相等的，但主键值为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"nb\">id</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">AutoField</span><span class=\"p\">(</span><span class=\"n\">primary_key</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyProxyModel</span><span class=\"p\">(</span><span class=\"n\">MyModel</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">proxy</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MultitableInherited</span><span class=\"p\">(</span><span class=\"n\">MyModel</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"c1\"># Primary keys compared</span>\n<span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"c1\"># Primary keys are None</span>\n<span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"c1\"># Same instance</span>\n<span class=\"n\">instance</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"n\">instance</span> <span class=\"o\">==</span> <span class=\"n\">instance</span>\n<span class=\"c1\"># Proxy model</span>\n<span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">==</span> <span class=\"n\">MyProxyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"c1\"># Multi-table inheritance</span>\n<span class=\"n\">MyModel</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">!=</span> <span class=\"n\">MultitableInherited</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"hash\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">__hash__()</span></code><a class=\"heading-anchor\" href=\"#hash\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.__hash__\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">__hash__</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.__hash__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">__hash__()</span></code> method is based on the instance's primary key value. It\nis effectively <code class=\"docutils literal notranslate\"><span class=\"pre\">hash(obj.pk)</span></code>. If the instance doesn't have a primary key\nvalue then a <code class=\"docutils literal notranslate\"><span class=\"pre\">TypeError</span></code> will be raised (otherwise the <code class=\"docutils literal notranslate\"><span class=\"pre\">__hash__()</span></code>\nmethod would return different values before and after the instance is\nsaved), but changing the <a class=\"reference external\" href=\"https://docs.python.org/3/reference/datamodel.html#object.__hash__\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__hash__()</span></code></a> value of an instance is\nforbidden in Python.</p>\n</section>\n<section id=\"get-absolute-url\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code><a class=\"heading-anchor\" href=\"#get-absolute-url\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.get_absolute_url\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_absolute_url</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.get_absolute_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>定义一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> 方法来告诉 Django 如何计算一个对象的标准 URL。对于调用者来说，这个方法应该返回一个字符串，可以通过 HTTP 引用对象。</p>\n<p>例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_absolute_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;/people/</span><span class=\"si\">%i</span><span class=\"s2\">/&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">id</span>\n</code></pre></div>\n<p>While this code is correct and simple, it may not be the most portable way\nto write this kind of method. The <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/urlresolvers/#django.urls.reverse\" title=\"django.urls.reverse\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">reverse()</span></code></a> function is\nusually the best approach.</p>\n<p>例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_absolute_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;people-detail&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Django 使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> 的一个地方就是在管理应用中。如果一个对象定义了这个方法，那么对象编辑页面会有一个“View on site”的链接，直接跳转到对象的公开视图，就像 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> 给出的那样。</p>\n<p>类似的，Django 的其他几个部分，比如 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/syndication/\"><span class=\"doc\">联合供稿框架</span></a>，当定义了 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> 时，也会使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code>。如果你的模型的每个实例都有一个唯一的 URL，你应该定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>你应该避免从未经验证的用户输入中建立 URL，以减少链接或重定向中毒的可能性：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_absolute_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;/</span><span class=\"si\">%s</span><span class=\"s2\">/&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.name</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">'/example.com'</span></code>，这将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">'//example.com/'</span></code>，这反过来又是一个有效的协议相对 URL，但不是预期的 <code class=\"docutils literal notranslate\"><span class=\"pre\">'/%2Fexample.com/'</span></code>。</p>\n</aside>\n<p>It's good practice to use <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> in templates, instead of\nhardcoding your objects' URLs. For example, this template code is bad:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cm\">&lt;!-- BAD template code. Avoid! --&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/people/</span><span class=\"cp\">{{</span> <span class=\"nv\">object.id</span> <span class=\"cp\">}}</span><span class=\"s\">/&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">object.name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>这个模板代码就好多了：</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">object.get_absolute_url</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">object.name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>这里的逻辑是，如果你改变了你的对象的 URL 结构，即使是为了纠正拼写错误这样的小事，你也不想追踪 URL 可能被创建的每个地方。在 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> 中指定一次，然后让你的其他代码调用那个地方。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>从 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> 返回的字符串 <strong>必须</strong> 只包含 ASCII 字符（根据 URI 规范，<span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc3986.html#section-2\"><strong>RFC 3986 Section 2</strong></a>），必要时需要进行 URL 编码。</p>\n<p>调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> 的代码和模板应该可以直接使用结果，而不需要任何进一步的处理。如果你使用的字符串包含 ASCII 码范围以外的字符，你可能希望使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.encoding.iri_to_uri()</span></code> 函数来帮助解决这个问题。</p>\n</aside>\n</section>\n</section>\n<section id=\"extra-instance-methods\">\n<h2>额外的实例方法<a class=\"heading-anchor\" href=\"#extra-instance-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>In addition to <a class=\"reference internal\" href=\"#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>, <a class=\"reference internal\" href=\"#django.db.models.Model.delete\" title=\"django.db.models.Model.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a>, a model object\nmight have some of the following methods:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.get_FOO_display\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_FOO_display</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.get_FOO_display\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>对于每一个设置了 <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">choice</span></code> 的字段，该对象将有一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_FOO_display()</span></code> 方法，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">FOO</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">SHIRT_SIZES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;S&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Small&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;M&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Medium&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;L&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Large&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">60</span><span class=\"p\">)</span>\n    <span class=\"n\">shirt_size</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"n\">choices</span><span class=\"o\">=</span><span class=\"n\">SHIRT_SIZES</span><span class=\"p\">)</span>\n</code></pre></div>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Fred Flintstone&quot;</span><span class=\"p\">,</span> <span class=\"n\">shirt_size</span><span class=\"o\">=</span><span class=\"s2\">&quot;L&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">shirt_size</span>\n<span class=\"go\">&#39;L&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">get_shirt_size_display</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;Large&#39;</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.get_next_by_FOO\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_next_by_FOO</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.get_next_by_FOO\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model.get_previous_by_FOO\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_previous_by_FOO</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model.get_previous_by_FOO\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>对于每一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.DateField\" title=\"django.db.models.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> 没有 <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null=True</span></code>，该对象将有 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_next_by_FOO()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_previous_by_FOO()</span></code> 方法，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">FOO</span></code> 是字段名。这将返回与日期字段相关的下一个和上一个对象，适当时引发一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DoesNotExist</span></code></a> 异常。</p>\n<p>这两种方法都将使用模型的默认管理器执行查询。如果你需要模拟自定义管理器使用的过滤，或者想要执行一次性的自定义过滤，这两种方法也都接受可选的关键字参数，其格式应该是 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#field-lookups\"><span class=\"std std-ref\">字段查找</span></a> 中描述的格式。</p>\n<p>请注意，在日期值相同的情况下，这些方法将使用主键作为比较。这保证了没有记录被跳过或重复。这也意味着你不能对未保存的对象使用这些方法。</p>\n<aside class=\"admonition-overriding-extra-instance-methods admonition\">\n<p class=\"admonition-title\">覆盖额外的实例方法</p>\n<p>在大多数情况下，覆盖或继承 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_FOO_display()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">get_next_by_FOO()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_previous_by_FOO()</span></code> 应按预期工作。然而，由于它们是由元类添加的，所以要考虑所有可能的继承结构是不实际的。在更复杂的情况下，你应该覆盖 <code class=\"docutils literal notranslate\"><span class=\"pre\">Field.contribution_to_class()</span></code> 来设置你需要的方法。</p>\n</aside>\n</section>\n<section id=\"other-attributes\">\n<h2>其他属性<a class=\"heading-anchor\" href=\"#other-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"state\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">_state</span></code><a class=\"heading-anchor\" href=\"#state\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._state\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_state</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Model._state\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">_state</span></code> 属性指的是一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState</span></code> 对象，它跟踪模型实例的生命周期。</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState</span></code> object has three attributes: <code class=\"docutils literal notranslate\"><span class=\"pre\">adding</span></code>, a flag which is\n<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the model has not been saved to the database yet, <code class=\"docutils literal notranslate\"><span class=\"pre\">db</span></code>, a\nstring referring to the database alias the instance was loaded from or\nsaved to, and <code class=\"docutils literal notranslate\"><span class=\"pre\">fetch_mode</span></code>, the <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/fetch-modes/\"><span class=\"doc\">fetch mode</span></a> to be used in subsequent field fetches.</p>\n<p>Newly instantiated instances have <code class=\"docutils literal notranslate\"><span class=\"pre\">adding=True</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">db=None</span></code>,\nsince they are yet to be saved, and <code class=\"docutils literal notranslate\"><span class=\"pre\">fetch_mode=models.FETCH_ONE</span></code>.\nInstances fetched from a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> will have <code class=\"docutils literal notranslate\"><span class=\"pre\">adding=False</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">db</span></code>\nset to the alias of the associated database, and <code class=\"docutils literal notranslate\"><span class=\"pre\">fetch_mode</span></code> copied\nfrom the queryset's fetch mode.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">fetch_mode</span></code> attribute was added.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"is-pk-set\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">_is_pk_set()</span></code><a class=\"heading-anchor\" href=\"#is-pk-set\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Model._is_pk_set\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Model.</span></span><span class=\"sig-name descname\"><span class=\"pre\">_is_pk_set</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Model._is_pk_set\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">_is_pk_set()</span></code> method returns whether the model instance's <code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code> is\nset. It abstracts the model's primary key definition, ensuring consistent\nbehavior regardless of the specific <code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code> configuration. A\n<code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseDefault</span></code> on an unsaved instance is considered unset.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>In earlier versions, <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> was returned for <code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseDefault</span></code>\nvalues.</p>\n</aside>\n</dd></dl>\n\n</section>\n</section>","rootId":"model-instance-reference","toc":[{"title":"创建对象","anchor":"creating-objects","children":[{"title":"自定义模型加载","anchor":"customizing-model-loading","children":[]}]},{"title":"从数据库中刷新对象","anchor":"refreshing-objects-from-database","children":[]},{"title":"验证对象","anchor":"validating-objects","children":[]},{"title":"保存对象","anchor":"saving-objects","children":[{"title":"自增主键","anchor":"auto-incrementing-primary-keys","children":[{"title":"pk 属性","anchor":"the-pk-property","children":[]},{"title":"明确指定自动主键值","anchor":"explicitly-specifying-auto-primary-key-values","children":[]}]},{"title":"保存时会发生什么？","anchor":"what-happens-when-you-save","children":[]},{"title":"Django 是如何知道 UPDATE 与 INSERT 的？","anchor":"how-django-knows-to-update-vs-insert","children":[{"title":"强制执行 INSERT 或 UPDATE","anchor":"forcing-an-insert-or-update","children":[]}]},{"title":"基于现有字段更新属性","anchor":"updating-attributes-based-on-existing-fields","children":[]},{"title":"指定要保存的字段","anchor":"specifying-which-fields-to-save","children":[]}]},{"title":"删除对象","anchor":"deleting-objects","children":[]},{"title":"Pickle 序列化对象","anchor":"pickling-objects","children":[]},{"title":"其他模型实例方法","anchor":"other-model-instance-methods","children":[{"title":"__str__()","anchor":"str","children":[]},{"title":"__eq__()","anchor":"eq","children":[]},{"title":"__hash__()","anchor":"hash","children":[]},{"title":"get_absolute_url()","anchor":"get-absolute-url","children":[]}]},{"title":"额外的实例方法","anchor":"extra-instance-methods","children":[]},{"title":"其他属性","anchor":"other-attributes","children":[{"title":"_state","anchor":"state","children":[]},{"title":"_is_pk_set()","anchor":"is-pk-set","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.1/ref/"},{"docname":"ref/models/index","title":"模型","url":"/zh-hans/6.1/ref/models/"}],"prev":{"docname":"ref/models/options","title":"模型 Meta 选项","url":"/zh-hans/6.1/ref/models/options/"},"next":{"docname":"ref/models/querysets","title":"QuerySet API 参考","url":"/zh-hans/6.1/ref/models/querysets/"},"formats":{"html":"/zh-hans/6.1/ref/models/instances/","markdown":"/zh-hans/6.1/ref/models/instances.md","json":"/zh-hans/6.1/ref/models/instances.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/models/instances.txt","official":"https://docs.djangoproject.com/zh-hans/6.1/ref/models/instances/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}