evennia/docs/latest/_modules/django/db/models/base.html
Evennia docbuilder action 4544902e08 Updated HTML docs.
2026-02-15 17:42:43 +00:00

2653 lines
No EOL
355 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-content_root="../../../../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>django.db.models.base &#8212; Evennia latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=d75fae25" />
<link rel="stylesheet" type="text/css" href="../../../../_static/nature.css?v=279e0f84" />
<link rel="stylesheet" type="text/css" href="../../../../_static/custom.css?v=e4a91a55" />
<script src="../../../../_static/documentation_options.js?v=c6e86fd7"></script>
<script src="../../../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">django.db.models.base</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for django.db.models.base</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">copy</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">inspect</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">defaultdict</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">functools</span><span class="w"> </span><span class="kn">import</span> <span class="n">partialmethod</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">itertools</span><span class="w"> </span><span class="kn">import</span> <span class="n">chain</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">asgiref.sync</span><span class="w"> </span><span class="kn">import</span> <span class="n">sync_to_async</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">django</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.apps</span><span class="w"> </span><span class="kn">import</span> <span class="n">apps</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core</span><span class="w"> </span><span class="kn">import</span> <span class="n">checks</span>
<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="p">(</span>
<span class="n">NON_FIELD_ERRORS</span><span class="p">,</span>
<span class="n">FieldDoesNotExist</span><span class="p">,</span>
<span class="n">FieldError</span><span class="p">,</span>
<span class="n">MultipleObjectsReturned</span><span class="p">,</span>
<span class="n">ObjectDoesNotExist</span><span class="p">,</span>
<span class="n">ObjectNotUpdated</span><span class="p">,</span>
<span class="n">ValidationError</span><span class="p">,</span>
<span class="p">)</span>
<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="p">(</span>
<span class="n">DJANGO_VERSION_PICKLE_KEY</span><span class="p">,</span>
<span class="n">DatabaseError</span><span class="p">,</span>
<span class="n">connection</span><span class="p">,</span>
<span class="n">connections</span><span class="p">,</span>
<span class="n">router</span><span class="p">,</span>
<span class="n">transaction</span><span class="p">,</span>
<span class="p">)</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">NOT_PROVIDED</span><span class="p">,</span> <span class="n">ExpressionWrapper</span><span class="p">,</span> <span class="n">IntegerField</span><span class="p">,</span> <span class="n">Max</span><span class="p">,</span> <span class="n">Value</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.constants</span><span class="w"> </span><span class="kn">import</span> <span class="n">LOOKUP_SEP</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.deletion</span><span class="w"> </span><span class="kn">import</span> <span class="n">CASCADE</span><span class="p">,</span> <span class="n">Collector</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">DatabaseDefault</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.fields.composite</span><span class="w"> </span><span class="kn">import</span> <span class="n">CompositePrimaryKey</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.fields.related</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">ForeignObjectRel</span><span class="p">,</span>
<span class="n">OneToOneField</span><span class="p">,</span>
<span class="n">lazy_related_operation</span><span class="p">,</span>
<span class="n">resolve_relation</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.functions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Coalesce</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.manager</span><span class="w"> </span><span class="kn">import</span> <span class="n">Manager</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.options</span><span class="w"> </span><span class="kn">import</span> <span class="n">Options</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.query</span><span class="w"> </span><span class="kn">import</span> <span class="n">F</span><span class="p">,</span> <span class="n">Q</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.signals</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">class_prepared</span><span class="p">,</span>
<span class="n">post_init</span><span class="p">,</span>
<span class="n">post_save</span><span class="p">,</span>
<span class="n">pre_init</span><span class="p">,</span>
<span class="n">pre_save</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">AltersData</span><span class="p">,</span> <span class="n">make_model_tuple</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.encoding</span><span class="w"> </span><span class="kn">import</span> <span class="n">force_str</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.hashable</span><span class="w"> </span><span class="kn">import</span> <span class="n">make_hashable</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.text</span><span class="w"> </span><span class="kn">import</span> <span class="n">capfirst</span><span class="p">,</span> <span class="n">get_text_list</span>
<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>
<span class="k">class</span><span class="w"> </span><span class="nc">Deferred</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&lt;Deferred field&gt;&quot;</span>
<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>
<span class="k">return</span> <span class="s2">&quot;&lt;Deferred field&gt;&quot;</span>
<span class="n">DEFERRED</span> <span class="o">=</span> <span class="n">Deferred</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">subclass_exception</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">attached_to</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create exception subclass. Used by ModelBase below.</span>
<span class="sd"> The exception is created in a way that allows it to be pickled, assuming</span>
<span class="sd"> that the returned exception class will be added as an attribute to the</span>
<span class="sd"> &#39;attached_to&#39; class.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">type</span><span class="p">(</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">bases</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;__module__&quot;</span><span class="p">:</span> <span class="n">module</span><span class="p">,</span>
<span class="s2">&quot;__qualname__&quot;</span><span class="p">:</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">attached_to</span><span class="o">.</span><span class="vm">__qualname__</span><span class="p">,</span> <span class="n">name</span><span class="p">),</span>
<span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_has_contribute_to_class</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># Only call contribute_to_class() if it&#39;s bound.</span>
<span class="k">return</span> <span class="ow">not</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;contribute_to_class&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="ModelBase">
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.models.html#evennia.typeclasses.models.ModelBase">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">ModelBase</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Metaclass for all models.&quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">attrs</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">super_new</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span>
<span class="c1"># Also ensure initialization is only performed for subclasses of Model</span>
<span class="c1"># (excluding Model class itself).</span>
<span class="n">parents</span> <span class="o">=</span> <span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">bases</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">ModelBase</span><span class="p">)]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">parents</span><span class="p">:</span>
<span class="k">return</span> <span class="n">super_new</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">attrs</span><span class="p">)</span>
<span class="c1"># Create the class.</span>
<span class="n">module</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;__module__&quot;</span><span class="p">)</span>
<span class="n">new_attrs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;__module__&quot;</span><span class="p">:</span> <span class="n">module</span><span class="p">}</span>
<span class="n">classcell</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;__classcell__&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">classcell</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">new_attrs</span><span class="p">[</span><span class="s2">&quot;__classcell__&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">classcell</span>
<span class="n">attr_meta</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;Meta&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="c1"># Pass all attrs without a (Django-specific) contribute_to_class()</span>
<span class="c1"># method to type.__new__() so that they&#39;re properly initialized</span>
<span class="c1"># (i.e. __set_name__()).</span>
<span class="n">contributable_attrs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">obj_name</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">attrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">_has_contribute_to_class</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="n">contributable_attrs</span><span class="p">[</span><span class="n">obj_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_attrs</span><span class="p">[</span><span class="n">obj_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">obj</span>
<span class="n">new_class</span> <span class="o">=</span> <span class="n">super_new</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">new_attrs</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">abstract</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">attr_meta</span><span class="p">,</span> <span class="s2">&quot;abstract&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">meta</span> <span class="o">=</span> <span class="n">attr_meta</span> <span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">new_class</span><span class="p">,</span> <span class="s2">&quot;Meta&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">base_meta</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">new_class</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Look for an application configuration to attach the model to.</span>
<span class="n">app_config</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_containing_app_config</span><span class="p">(</span><span class="n">module</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="s2">&quot;app_label&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">app_config</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">abstract</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
<span class="s2">&quot;Model class </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2"> doesn&#39;t declare an explicit &quot;</span>
<span class="s2">&quot;app_label and isn&#39;t in an application in &quot;</span>
<span class="s2">&quot;INSTALLED_APPS.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="n">app_config</span><span class="o">.</span><span class="n">label</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span><span class="s2">&quot;_meta&quot;</span><span class="p">,</span> <span class="n">Options</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="n">app_label</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">abstract</span><span class="p">:</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span>
<span class="s2">&quot;DoesNotExist&quot;</span><span class="p">,</span>
<span class="n">subclass_exception</span><span class="p">(</span>
<span class="s2">&quot;DoesNotExist&quot;</span><span class="p">,</span>
<span class="nb">tuple</span><span class="p">(</span>
<span class="n">x</span><span class="o">.</span><span class="n">DoesNotExist</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parents</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span>
<span class="p">)</span>
<span class="ow">or</span> <span class="p">(</span><span class="n">ObjectDoesNotExist</span><span class="p">,),</span>
<span class="n">module</span><span class="p">,</span>
<span class="n">attached_to</span><span class="o">=</span><span class="n">new_class</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span>
<span class="s2">&quot;MultipleObjectsReturned&quot;</span><span class="p">,</span>
<span class="n">subclass_exception</span><span class="p">(</span>
<span class="s2">&quot;MultipleObjectsReturned&quot;</span><span class="p">,</span>
<span class="nb">tuple</span><span class="p">(</span>
<span class="n">x</span><span class="o">.</span><span class="n">MultipleObjectsReturned</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parents</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span>
<span class="p">)</span>
<span class="ow">or</span> <span class="p">(</span><span class="n">MultipleObjectsReturned</span><span class="p">,),</span>
<span class="n">module</span><span class="p">,</span>
<span class="n">attached_to</span><span class="o">=</span><span class="n">new_class</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span>
<span class="s2">&quot;NotUpdated&quot;</span><span class="p">,</span>
<span class="n">subclass_exception</span><span class="p">(</span>
<span class="s2">&quot;NotUpdated&quot;</span><span class="p">,</span>
<span class="nb">tuple</span><span class="p">(</span>
<span class="n">x</span><span class="o">.</span><span class="n">NotUpdated</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">parents</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span>
<span class="p">)</span>
<span class="c1"># Subclass DatabaseError as well for backward compatibility</span>
<span class="c1"># reasons as __subclasshook__ is not taken into account on</span>
<span class="c1"># exception handling.</span>
<span class="ow">or</span> <span class="p">(</span><span class="n">ObjectNotUpdated</span><span class="p">,</span> <span class="n">DatabaseError</span><span class="p">),</span>
<span class="n">module</span><span class="p">,</span>
<span class="n">attached_to</span><span class="o">=</span><span class="n">new_class</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">base_meta</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">base_meta</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="c1"># Non-abstract child classes inherit some attributes from their</span>
<span class="c1"># non-abstract parent (unless an ABC comes before it in the</span>
<span class="c1"># method resolution order).</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="s2">&quot;ordering&quot;</span><span class="p">):</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">ordering</span> <span class="o">=</span> <span class="n">base_meta</span><span class="o">.</span><span class="n">ordering</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="s2">&quot;get_latest_by&quot;</span><span class="p">):</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_latest_by</span> <span class="o">=</span> <span class="n">base_meta</span><span class="o">.</span><span class="n">get_latest_by</span>
<span class="n">is_proxy</span> <span class="o">=</span> <span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">proxy</span>
<span class="c1"># If the model is a proxy, ensure that the base class</span>
<span class="c1"># hasn&#39;t been swapped out.</span>
<span class="k">if</span> <span class="n">is_proxy</span> <span class="ow">and</span> <span class="n">base_meta</span> <span class="ow">and</span> <span class="n">base_meta</span><span class="o">.</span><span class="n">swapped</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> cannot proxy the swapped model &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">base_meta</span><span class="o">.</span><span class="n">swapped</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># Add remaining attributes (those with a contribute_to_class() method)</span>
<span class="c1"># to the class.</span>
<span class="k">for</span> <span class="n">obj_name</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">contributable_attrs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span><span class="n">obj_name</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="c1"># All the fields of any type declared on this model</span>
<span class="n">new_fields</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">,</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_many_to_many</span><span class="p">,</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">private_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">field_names</span> <span class="o">=</span> <span class="p">{</span><span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">new_fields</span><span class="p">}</span>
<span class="c1"># Basic setup for proxy models.</span>
<span class="k">if</span> <span class="n">is_proxy</span><span class="p">:</span>
<span class="n">base</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="p">[</span><span class="n">kls</span> <span class="k">for</span> <span class="n">kls</span> <span class="ow">in</span> <span class="n">parents</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">kls</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">)]:</span>
<span class="k">if</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="k">if</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="s2">&quot;Abstract base class containing model fields not &quot;</span>
<span class="s2">&quot;permitted for proxy model &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="n">name</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">base</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">parent</span>
<span class="k">elif</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="s2">&quot;Proxy model &#39;</span><span class="si">%s</span><span class="s2">&#39; has more than one non-abstract model base &quot;</span>
<span class="s2">&quot;class.&quot;</span> <span class="o">%</span> <span class="n">name</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">base</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="s2">&quot;Proxy model &#39;</span><span class="si">%s</span><span class="s2">&#39; has no non-abstract model base class.&quot;</span> <span class="o">%</span> <span class="n">name</span>
<span class="p">)</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">setup_proxy</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span> <span class="o">=</span> <span class="n">new_class</span>
<span class="c1"># Collect the parent links for multi-table inheritance.</span>
<span class="n">parent_links</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">base</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">([</span><span class="n">new_class</span><span class="p">,</span> <span class="o">*</span><span class="n">parents</span><span class="p">]):</span>
<span class="c1"># Conceptually equivalent to `if base is Model`.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">):</span>
<span class="k">continue</span>
<span class="c1"># Skip concrete parent classes.</span>
<span class="k">if</span> <span class="n">base</span> <span class="o">!=</span> <span class="n">new_class</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># Locate OneToOneField instances.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">OneToOneField</span><span class="p">)</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">parent_link</span><span class="p">:</span>
<span class="n">related</span> <span class="o">=</span> <span class="n">resolve_relation</span><span class="p">(</span><span class="n">new_class</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
<span class="n">parent_links</span><span class="p">[</span><span class="n">make_model_tuple</span><span class="p">(</span><span class="n">related</span><span class="p">)]</span> <span class="o">=</span> <span class="n">field</span>
<span class="c1"># Track fields inherited from base models.</span>
<span class="n">inherited_attributes</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="c1"># Do the appropriate setup for any model parents.</span>
<span class="k">for</span> <span class="n">base</span> <span class="ow">in</span> <span class="n">new_class</span><span class="o">.</span><span class="n">mro</span><span class="p">():</span>
<span class="k">if</span> <span class="n">base</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">parents</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="s2">&quot;_meta&quot;</span><span class="p">):</span>
<span class="c1"># Things without _meta aren&#39;t functional models, so they&#39;re</span>
<span class="c1"># uninteresting parents.</span>
<span class="n">inherited_attributes</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">base</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">parent_fields</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span> <span class="o">+</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_many_to_many</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="c1"># Check for clashes between locally declared fields and those</span>
<span class="c1"># on the base classes.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">parent_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">field_names</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">FieldError</span><span class="p">(</span>
<span class="s2">&quot;Local field </span><span class="si">%r</span><span class="s2"> in class </span><span class="si">%r</span><span class="s2"> clashes with field of &quot;</span>
<span class="s2">&quot;the same name from base class </span><span class="si">%r</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">base</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">inherited_attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="c1"># Concrete classes...</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span>
<span class="n">base_key</span> <span class="o">=</span> <span class="n">make_model_tuple</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
<span class="k">if</span> <span class="n">base_key</span> <span class="ow">in</span> <span class="n">parent_links</span><span class="p">:</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">parent_links</span><span class="p">[</span><span class="n">base_key</span><span class="p">]</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">is_proxy</span><span class="p">:</span>
<span class="n">attr_name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">_ptr&quot;</span> <span class="o">%</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">OneToOneField</span><span class="p">(</span>
<span class="n">base</span><span class="p">,</span>
<span class="n">on_delete</span><span class="o">=</span><span class="n">CASCADE</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="n">attr_name</span><span class="p">,</span>
<span class="n">auto_created</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">parent_link</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">attr_name</span> <span class="ow">in</span> <span class="n">field_names</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">FieldError</span><span class="p">(</span>
<span class="s2">&quot;Auto-generated field &#39;</span><span class="si">%s</span><span class="s2">&#39; in class </span><span class="si">%r</span><span class="s2"> for &quot;</span>
<span class="s2">&quot;parent_link to base class </span><span class="si">%r</span><span class="s2"> clashes with &quot;</span>
<span class="s2">&quot;declared field of the same name.&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">attr_name</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">base</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="c1"># Only add the ptr field if it&#39;s not already present;</span>
<span class="c1"># e.g. migrations will already have it specified</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">new_class</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">):</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span><span class="n">attr_name</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">field</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">parents</span><span class="p">[</span><span class="n">base</span><span class="p">]</span> <span class="o">=</span> <span class="n">field</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">base_parents</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">parents</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="c1"># Add fields from abstract base class if it wasn&#39;t overridden.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">parent_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">field_names</span>
<span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">new_class</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inherited_attributes</span>
<span class="p">):</span>
<span class="n">new_field</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">new_field</span><span class="p">)</span>
<span class="c1"># Replace parent links defined on this base by the new</span>
<span class="c1"># field. It will be appropriately resolved if required.</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">one_to_one</span><span class="p">:</span>
<span class="k">for</span> <span class="n">parent</span><span class="p">,</span> <span class="n">parent_link</span> <span class="ow">in</span> <span class="n">base_parents</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">field</span> <span class="o">==</span> <span class="n">parent_link</span><span class="p">:</span>
<span class="n">base_parents</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_field</span>
<span class="c1"># Pass any non-abstract parent classes onto child.</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">parents</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">base_parents</span><span class="p">)</span>
<span class="c1"># Inherit private fields (like GenericForeignKey) from the parent</span>
<span class="c1"># class if they are not overridden.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">private_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">field_names</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">FieldError</span><span class="p">(</span>
<span class="s2">&quot;Local field </span><span class="si">%r</span><span class="s2"> in class </span><span class="si">%r</span><span class="s2"> clashes with field of &quot;</span>
<span class="s2">&quot;the same name from base class </span><span class="si">%r</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">name</span><span class="p">,</span>
<span class="n">base</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="p">(</span>
<span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">new_class</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inherited_attributes</span>
<span class="p">):</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">base</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="n">field</span><span class="o">.</span><span class="n">mti_inherited</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="c1"># Copy indexes so that index names are unique when models extend an</span>
<span class="c1"># abstract model.</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">indexes</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">indexes</span>
<span class="p">]</span>
<span class="k">if</span> <span class="n">abstract</span><span class="p">:</span>
<span class="c1"># Abstract base models can&#39;t be instantiated and don&#39;t appear in</span>
<span class="c1"># the list of models for an app. We do the final setup for them a</span>
<span class="c1"># little differently from normal models.</span>
<span class="n">attr_meta</span><span class="o">.</span><span class="n">abstract</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">Meta</span> <span class="o">=</span> <span class="n">attr_meta</span>
<span class="k">return</span> <span class="n">new_class</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_prepare</span><span class="p">()</span>
<span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">apps</span><span class="o">.</span><span class="n">register_model</span><span class="p">(</span><span class="n">new_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">new_class</span><span class="p">)</span>
<span class="k">return</span> <span class="n">new_class</span>
<div class="viewcode-block" id="ModelBase.add_to_class">
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.models.html#evennia.typeclasses.models.ModelBase.add_to_class">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_to_class</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">_has_contribute_to_class</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="n">value</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_prepare</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Create some methods once self._meta has been populated.&quot;&quot;&quot;</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">opts</span><span class="o">.</span><span class="n">_prepare</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="k">if</span> <span class="n">opts</span><span class="o">.</span><span class="n">order_with_respect_to</span><span class="p">:</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">get_next_in_order</span> <span class="o">=</span> <span class="n">partialmethod</span><span class="p">(</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_get_next_or_previous_in_order</span><span class="p">,</span> <span class="n">is_next</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">get_previous_in_order</span> <span class="o">=</span> <span class="n">partialmethod</span><span class="p">(</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_get_next_or_previous_in_order</span><span class="p">,</span> <span class="n">is_next</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="c1"># Defer creating accessors on the foreign class until it has been</span>
<span class="c1"># created and registered. If remote_field is None, we&#39;re ordering</span>
<span class="c1"># with respect to a GenericForeignKey and don&#39;t know what the</span>
<span class="c1"># foreign class is - we&#39;ll add those accessors later in</span>
<span class="c1"># contribute_to_class().</span>
<span class="k">if</span> <span class="n">opts</span><span class="o">.</span><span class="n">order_with_respect_to</span><span class="o">.</span><span class="n">remote_field</span><span class="p">:</span>
<span class="n">wrt</span> <span class="o">=</span> <span class="n">opts</span><span class="o">.</span><span class="n">order_with_respect_to</span>
<span class="n">remote</span> <span class="o">=</span> <span class="n">wrt</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span>
<span class="n">lazy_related_operation</span><span class="p">(</span><span class="n">make_foreign_order_accessors</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">remote</span><span class="p">)</span>
<span class="c1"># Give the class a docstring -- its definition.</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__doc__</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">cls</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span>
<span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">opts</span><span class="o">.</span><span class="n">fields</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">get_absolute_url_override</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">ABSOLUTE_URL_OVERRIDES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="n">opts</span><span class="o">.</span><span class="n">label_lower</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">get_absolute_url_override</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="s2">&quot;get_absolute_url&quot;</span><span class="p">,</span> <span class="n">get_absolute_url_override</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">opts</span><span class="o">.</span><span class="n">managers</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;objects&quot;</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">opts</span><span class="o">.</span><span class="n">fields</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Model </span><span class="si">%s</span><span class="s2"> must specify a custom Manager, because it has a &quot;</span>
<span class="s2">&quot;field named &#39;objects&#39;.&quot;</span> <span class="o">%</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span>
<span class="p">)</span>
<span class="n">manager</span> <span class="o">=</span> <span class="n">Manager</span><span class="p">()</span>
<span class="n">manager</span><span class="o">.</span><span class="n">auto_created</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">add_to_class</span><span class="p">(</span><span class="s2">&quot;objects&quot;</span><span class="p">,</span> <span class="n">manager</span><span class="p">)</span>
<span class="c1"># Set the name of _meta.indexes. This can&#39;t be done in</span>
<span class="c1"># Options.contribute_to_class() because fields haven&#39;t been added to</span>
<span class="c1"># the model at that point.</span>
<span class="k">for</span> <span class="n">index</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">indexes</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">index</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
<span class="n">index</span><span class="o">.</span><span class="n">set_name_with_model</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="n">class_prepared</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="bp">cls</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_base_manager</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">base_manager</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_default_manager</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">default_manager</span></div>
<span class="k">class</span><span class="w"> </span><span class="nc">ModelStateFieldsCacheDescriptor</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="bp">cls</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">instance</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">instance</span><span class="o">.</span><span class="n">fields_cache</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ModelState</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Store model instance state.&quot;&quot;&quot;</span>
<span class="n">db</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># If true, uniqueness validation checks will consider this a new, unsaved</span>
<span class="c1"># object. Necessary for correct validation of new instances of objects with</span>
<span class="c1"># explicit (non-auto) PKs. This impacts validation only; it has no effect</span>
<span class="c1"># on the actual save.</span>
<span class="n">adding</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">fields_cache</span> <span class="o">=</span> <span class="n">ModelStateFieldsCacheDescriptor</span><span class="p">()</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Model</span><span class="p">(</span><span class="n">AltersData</span><span class="p">,</span> <span class="n">metaclass</span><span class="o">=</span><span class="n">ModelBase</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># Alias some things as locals to avoid repeat global lookups</span>
<span class="bp">cls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">_setattr</span> <span class="o">=</span> <span class="nb">setattr</span>
<span class="n">_DEFERRED</span> <span class="o">=</span> <span class="n">DEFERRED</span>
<span class="k">if</span> <span class="n">opts</span><span class="o">.</span><span class="n">abstract</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Abstract models cannot be instantiated.&quot;</span><span class="p">)</span>
<span class="n">pre_init</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># Set up the storage for instance state</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">=</span> <span class="n">ModelState</span><span class="p">()</span>
<span class="c1"># There is a rather weird disparity here; if kwargs, it&#39;s set, then</span>
<span class="c1"># args overrides it. It should be one or the other; don&#39;t duplicate the</span>
<span class="c1"># work The reason for the kwargs check is that standard iterator passes</span>
<span class="c1"># in by args, and instantiation for iteration is 33% faster.</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">concrete_fields</span><span class="p">):</span>
<span class="c1"># Daft, but matches old exception sans the err msg.</span>
<span class="k">raise</span> <span class="ne">IndexError</span><span class="p">(</span><span class="s2">&quot;Number of args exceeds number of fields&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">fields_iter</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">concrete_fields</span><span class="p">)</span>
<span class="c1"># The ordering of the zip calls matter - zip throws StopIteration</span>
<span class="c1"># when an iter throws it. So if the first iter throws it, the</span>
<span class="c1"># second is *not* consumed. We rely on this, so don&#39;t change the</span>
<span class="c1"># order without changing the logic.</span>
<span class="k">for</span> <span class="n">val</span><span class="p">,</span> <span class="n">field</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">fields_iter</span><span class="p">):</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="n">_DEFERRED</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Slower, kwargs-ready version.</span>
<span class="n">fields_iter</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">fields</span><span class="p">)</span>
<span class="k">for</span> <span class="n">val</span><span class="p">,</span> <span class="n">field</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">fields_iter</span><span class="p">):</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="n">_DEFERRED</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">NOT_PROVIDED</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOT_PROVIDED</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__qualname__</span><span class="si">}</span><span class="s2">() got both positional and &quot;</span>
<span class="sa">f</span><span class="s2">&quot;keyword arguments for field &#39;</span><span class="si">{</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39;.&quot;</span>
<span class="p">)</span>
<span class="c1"># Now we&#39;re left with the unprocessed fields that *must* come from</span>
<span class="c1"># keywords, or default.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields_iter</span><span class="p">:</span>
<span class="n">is_related_object</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># Virtual field</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">column</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">field</span><span class="o">.</span><span class="n">generated</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="n">ForeignObjectRel</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Assume object instance was passed in.</span>
<span class="n">rel_obj</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="n">is_related_object</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Object instance wasn&#39;t passed in -- must be an</span>
<span class="c1"># ID.</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">get_default</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="c1"># This is done with an exception rather than the</span>
<span class="c1"># default argument on pop because we don&#39;t want</span>
<span class="c1"># get_default() to be evaluated, and then not used.</span>
<span class="c1"># Refs #12057.</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">get_default</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">get_default</span><span class="p">()</span>
<span class="k">if</span> <span class="n">is_related_object</span><span class="p">:</span>
<span class="c1"># If we are passed a related instance, set it using the</span>
<span class="c1"># field.name instead of field.attname (e.g. &quot;user&quot; instead of</span>
<span class="c1"># &quot;user_id&quot;) so that the object gets properly cached (and type</span>
<span class="c1"># checked) by the RelatedObjectDescriptor.</span>
<span class="k">if</span> <span class="n">rel_obj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_DEFERRED</span><span class="p">:</span>
<span class="n">_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">rel_obj</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_DEFERRED</span><span class="p">:</span>
<span class="n">_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">property_names</span> <span class="o">=</span> <span class="n">opts</span><span class="o">.</span><span class="n">_property_names</span>
<span class="n">unexpected</span> <span class="o">=</span> <span class="p">()</span>
<span class="k">for</span> <span class="n">prop</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># Any remaining kwargs must correspond to properties or virtual</span>
<span class="c1"># fields.</span>
<span class="k">if</span> <span class="n">prop</span> <span class="ow">in</span> <span class="n">property_names</span><span class="p">:</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>
<span class="n">_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prop</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">prop</span><span class="p">)</span>
<span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span>
<span class="n">unexpected</span> <span class="o">+=</span> <span class="p">(</span><span class="n">prop</span><span class="p">,)</span>
<span class="k">else</span><span class="p">:</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>
<span class="n">_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prop</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">unexpected</span><span class="p">:</span>
<span class="n">unexpected_names</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">unexpected</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">() got unexpected keyword arguments: &quot;</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">unexpected_names</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="n">post_init</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">sender</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="nd">@classmethod</span>
<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>
<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>
<span class="n">values_iter</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
<span class="n">values</span> <span class="o">=</span> <span class="p">[</span>
<span class="nb">next</span><span class="p">(</span><span class="n">values_iter</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>
<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>
<span class="p">]</span>
<span class="n">new</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>
<span class="n">new</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>
<span class="n">new</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>
<span class="k">return</span> <span class="n">new</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&lt;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&gt;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<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>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> object (</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">NotImplemented</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">my_pk</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pk</span>
<span class="k">if</span> <span class="n">my_pk</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span> <span class="ow">is</span> <span class="n">other</span>
<span class="k">return</span> <span class="n">my_pk</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">pk</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">():</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Model instances without primary key value are unhashable&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__getstate__</span><span class="p">()</span>
<span class="n">data</span><span class="p">[</span><span class="n">DJANGO_VERSION_PICKLE_KEY</span><span class="p">]</span> <span class="o">=</span> <span class="n">django</span><span class="o">.</span><span class="n">__version__</span>
<span class="n">class_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span>
<span class="k">return</span> <span class="n">model_unpickle</span><span class="p">,</span> <span class="p">(</span><span class="n">class_id</span><span class="p">,),</span> <span class="n">data</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Hook to allow choosing the attributes to pickle.&quot;&quot;&quot;</span>
<span class="n">state</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">state</span><span class="p">[</span><span class="s2">&quot;_state&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="s2">&quot;_state&quot;</span><span class="p">])</span>
<span class="n">state</span><span class="p">[</span><span class="s2">&quot;_state&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">fields_cache</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="s2">&quot;_state&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">fields_cache</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="c1"># memoryview cannot be pickled, so cast it to bytes and store</span>
<span class="c1"># separately.</span>
<span class="n">_memoryview_attrs</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">state</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">memoryview</span><span class="p">):</span>
<span class="n">_memoryview_attrs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">attr</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">_memoryview_attrs</span><span class="p">:</span>
<span class="n">state</span><span class="p">[</span><span class="s2">&quot;_memoryview_attrs&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_memoryview_attrs</span>
<span class="k">for</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">_memoryview_attrs</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">state</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
<span class="n">pickled_version</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">DJANGO_VERSION_PICKLE_KEY</span><span class="p">)</span>
<span class="k">if</span> <span class="n">pickled_version</span><span class="p">:</span>
<span class="k">if</span> <span class="n">pickled_version</span> <span class="o">!=</span> <span class="n">django</span><span class="o">.</span><span class="n">__version__</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;Pickled model instance&#39;s Django version </span><span class="si">%s</span><span class="s2"> does not &quot;</span>
<span class="s2">&quot;match the current version </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">pickled_version</span><span class="p">,</span> <span class="n">django</span><span class="o">.</span><span class="n">__version__</span><span class="p">),</span>
<span class="ne">RuntimeWarning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;Pickled model instance&#39;s Django version is not specified.&quot;</span><span class="p">,</span>
<span class="ne">RuntimeWarning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;_memoryview_attrs&quot;</span> <span class="ow">in</span> <span class="n">state</span><span class="p">:</span>
<span class="k">for</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;_memoryview_attrs&quot;</span><span class="p">):</span>
<span class="n">state</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nb">memoryview</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_pk_val</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">meta</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">meta</span> <span class="o">=</span> <span class="n">meta</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_set_pk_val</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">for</span> <span class="n">parent_link</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">parents</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="k">if</span> <span class="n">parent_link</span> <span class="ow">and</span> <span class="n">parent_link</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent_link</span><span class="o">.</span><span class="n">target_field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="n">pk</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_pk_val</span><span class="p">,</span> <span class="n">_set_pk_val</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_is_pk_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">meta</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">pk_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">(</span><span class="n">meta</span><span class="p">)</span>
<span class="k">return</span> <span class="ow">not</span> <span class="p">(</span>
<span class="n">pk_val</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">or</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">pk_val</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span><span class="n">f</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">pk_val</span><span class="p">))</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_deferred_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a set containing names of deferred fields for this instance.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">{</span>
<span class="n">f</span><span class="o">.</span><span class="n">attname</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_fields</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="p">}</span>
<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="n">from_queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reload field values from the database.</span>
<span class="sd"> By default, the reloading happens from the database this instance was</span>
<span class="sd"> loaded from, or by the read router if this instance wasn&#39;t loaded from</span>
<span class="sd"> any database. The using parameter will override the default.</span>
<span class="sd"> Fields can be used to specify which fields to reload. The fields</span>
<span class="sd"> should be an iterable of field attnames. If fields is None, then</span>
<span class="sd"> all non-deferred fields are reloaded.</span>
<span class="sd"> When accessing deferred fields of an instance, the deferred loading</span>
<span class="sd"> of the field will call this method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">fields</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">prefetched_objects_cache</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_prefetched_objects_cache&quot;</span><span class="p">,</span> <span class="p">())</span>
<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>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="o">.</span><span class="n">copy</span><span class="p">():</span>
<span class="k">if</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">prefetched_objects_cache</span><span class="p">:</span>
<span class="k">del</span> <span class="n">prefetched_objects_cache</span><span class="p">[</span><span class="n">field</span><span class="p">]</span>
<span class="n">fields</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">fields</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">LOOKUP_SEP</span> <span class="ow">in</span> <span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s1">&#39;Found &quot;</span><span class="si">%s</span><span class="s1">&quot; in fields argument. Relations and transforms &#39;</span>
<span class="s2">&quot;are not allowed in fields.&quot;</span> <span class="o">%</span> <span class="n">LOOKUP_SEP</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">from_queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">hints</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;instance&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">}</span>
<span class="n">from_queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">_base_manager</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">using</span><span class="p">,</span> <span class="n">hints</span><span class="o">=</span><span class="n">hints</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">using</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">from_queryset</span> <span class="o">=</span> <span class="n">from_queryset</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">using</span><span class="p">)</span>
<span class="n">db_instance_qs</span> <span class="o">=</span> <span class="n">from_queryset</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="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># Use provided fields, if not set then reload all non-deferred fields.</span>
<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>
<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>
<span class="n">db_instance_qs</span> <span class="o">=</span> <span class="n">db_instance_qs</span><span class="o">.</span><span class="n">only</span><span class="p">(</span><span class="o">*</span><span class="n">fields</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">deferred_fields</span><span class="p">:</span>
<span class="n">db_instance_qs</span> <span class="o">=</span> <span class="n">db_instance_qs</span><span class="o">.</span><span class="n">only</span><span class="p">(</span>
<span class="o">*</span><span class="p">{</span>
<span class="n">f</span><span class="o">.</span><span class="n">attname</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_fields</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">deferred_fields</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">db_instance</span> <span class="o">=</span> <span class="n">db_instance_qs</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="n">non_loaded_fields</span> <span class="o">=</span> <span class="n">db_instance</span><span class="o">.</span><span class="n">get_deferred_fields</span><span class="p">()</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span> <span class="ow">in</span> <span class="n">non_loaded_fields</span><span class="p">:</span>
<span class="c1"># This field wasn&#39;t refreshed - skip ahead.</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">concrete</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">db_instance</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">))</span>
<span class="c1"># Clear or copy cached foreign keys.</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">is_relation</span><span class="p">:</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="n">db_instance</span><span class="p">):</span>
<span class="n">field</span><span class="o">.</span><span class="n">set_cached_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">get_cached_value</span><span class="p">(</span><span class="n">db_instance</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">field</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">field</span><span class="o">.</span><span class="n">delete_cached_value</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Clear cached relations.</span>
<span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">related_objects</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">fields</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">rel</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">)</span> <span class="ow">and</span> <span class="n">rel</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">rel</span><span class="o">.</span><span class="n">delete_cached_value</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># Clear cached private relations.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">private_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span>
<span class="p">(</span><span class="n">fields</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">is_relation</span>
<span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">field</span><span class="o">.</span><span class="n">delete_cached_value</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</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_instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">arefresh_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="n">from_queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">return</span> <span class="k">await</span> <span class="n">sync_to_async</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">refresh_from_db</span><span class="p">)(</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">,</span> <span class="n">from_queryset</span><span class="o">=</span><span class="n">from_queryset</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">serializable_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field_name</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the value of the field name for this instance. If the field is</span>
<span class="sd"> a foreign key, return the id value instead of the object. If there&#39;s</span>
<span class="sd"> no Field object with this name on the model, return the model</span>
<span class="sd"> attribute&#39;s value.</span>
<span class="sd"> Used to serialize a field&#39;s value (in the serializer, or form output,</span>
<span class="sd"> for example). Normally, you would just access the attribute directly</span>
<span class="sd"> and not use this method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field_name</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<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="p">,</span>
<span class="n">force_insert</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">force_update</span><span class="o">=</span><span class="kc">False</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">update_fields</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Save the current instance. Override this in a subclass if you want to</span>
<span class="sd"> control the saving process.</span>
<span class="sd"> The &#39;force_insert&#39; and &#39;force_update&#39; parameters can be used to insist</span>
<span class="sd"> that the &quot;save&quot; must be an SQL insert or update (or equivalent for</span>
<span class="sd"> non-SQL backends), respectively. Normally, they should not be set.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_prepare_related_fields_for_save</span><span class="p">(</span><span class="n">operation_name</span><span class="o">=</span><span class="s2">&quot;save&quot;</span><span class="p">)</span>
<span class="n">using</span> <span class="o">=</span> <span class="n">using</span> <span class="ow">or</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="n">force_insert</span> <span class="ow">and</span> <span class="p">(</span><span class="n">force_update</span> <span class="ow">or</span> <span class="n">update_fields</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Cannot force both insert and updating in model saving.&quot;</span><span class="p">)</span>
<span class="n">deferred_non_generated_fields</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">f</span><span class="o">.</span><span class="n">attname</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_fields</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">generated</span> <span class="ow">is</span> <span class="kc">False</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">update_fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># If update_fields is empty, skip the save. We do also check for</span>
<span class="c1"># no-op saves later on for inheritance cases. This bailout is</span>
<span class="c1"># still needed for skipping signal sending.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">update_fields</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">update_fields</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span><span class="n">update_fields</span><span class="p">)</span>
<span class="n">field_names</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">_non_pk_concrete_field_names</span>
<span class="n">not_updatable_fields</span> <span class="o">=</span> <span class="n">update_fields</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">field_names</span><span class="p">)</span>
<span class="k">if</span> <span class="n">not_updatable_fields</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;The following fields do not exist in this model, are m2m &quot;</span>
<span class="s2">&quot;fields, primary keys, or are non-concrete fields: </span><span class="si">%s</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">not_updatable_fields</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># If saving to the same database, and this model is deferred, then</span>
<span class="c1"># automatically do an &quot;update_fields&quot; save on the loaded fields.</span>
<span class="k">elif</span> <span class="p">(</span>
<span class="ow">not</span> <span class="n">force_insert</span>
<span class="ow">and</span> <span class="n">deferred_non_generated_fields</span>
<span class="ow">and</span> <span class="n">using</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">()</span>
<span class="p">):</span>
<span class="n">field_names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">pk_fields</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk_fields</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">pk_fields</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;through&quot;</span><span class="p">):</span>
<span class="n">field_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="n">loaded_fields</span> <span class="o">=</span> <span class="n">field_names</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">deferred_non_generated_fields</span><span class="p">)</span>
<span class="k">if</span> <span class="n">loaded_fields</span><span class="p">:</span>
<span class="n">update_fields</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span><span class="n">loaded_fields</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">save_base</span><span class="p">(</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="n">force_insert</span><span class="o">=</span><span class="n">force_insert</span><span class="p">,</span>
<span class="n">force_update</span><span class="o">=</span><span class="n">force_update</span><span class="p">,</span>
<span class="n">update_fields</span><span class="o">=</span><span class="n">update_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">save</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">asave</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="o">*</span><span class="p">,</span>
<span class="n">force_insert</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">force_update</span><span class="o">=</span><span class="kc">False</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">update_fields</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="p">):</span>
<span class="k">return</span> <span class="k">await</span> <span class="n">sync_to_async</span><span class="p">(</span><span class="bp">self</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="n">force_insert</span><span class="p">,</span>
<span class="n">force_update</span><span class="o">=</span><span class="n">force_update</span><span class="p">,</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="n">update_fields</span><span class="o">=</span><span class="n">update_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">asave</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_validate_force_insert</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">force_insert</span><span class="p">):</span>
<span class="k">if</span> <span class="n">force_insert</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
<span class="k">return</span> <span class="p">()</span>
<span class="k">if</span> <span class="n">force_insert</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="bp">cls</span><span class="p">,)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">force_insert</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;force_insert must be a bool or tuple.&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">member</span> <span class="ow">in</span> <span class="n">force_insert</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">member</span><span class="p">,</span> <span class="n">ModelBase</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Invalid force_insert member. </span><span class="si">{</span><span class="n">member</span><span class="si">!r}</span><span class="s2"> must be a model subclass.&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">member</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Invalid force_insert member. </span><span class="si">{</span><span class="n">member</span><span class="o">.</span><span class="vm">__qualname__</span><span class="si">}</span><span class="s2"> must be a &quot;</span>
<span class="sa">f</span><span class="s2">&quot;base of </span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__qualname__</span><span class="si">}</span><span class="s2">.&quot;</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">force_insert</span>
<span class="k">def</span><span class="w"> </span><span class="nf">save_base</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">raw</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">force_insert</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">force_update</span><span class="o">=</span><span class="kc">False</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">update_fields</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Handle the parts of saving which should be done only once per save,</span>
<span class="sd"> yet need to be done in raw saves, too. This includes some sanity</span>
<span class="sd"> checks and signal sending.</span>
<span class="sd"> The &#39;raw&#39; argument is telling save_base not to save any parent</span>
<span class="sd"> models and not to do any changes to the values before save. This</span>
<span class="sd"> is used by fixture loading.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">using</span> <span class="o">=</span> <span class="n">using</span> <span class="ow">or</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="p">(</span><span class="n">force_insert</span> <span class="ow">and</span> <span class="p">(</span><span class="n">force_update</span> <span class="ow">or</span> <span class="n">update_fields</span><span class="p">))</span>
<span class="k">assert</span> <span class="n">update_fields</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">update_fields</span>
<span class="bp">cls</span> <span class="o">=</span> <span class="n">origin</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span>
<span class="c1"># Skip proxies, but keep the origin as the proxy model.</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">proxy</span><span class="p">:</span>
<span class="bp">cls</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span>
<span class="n">meta</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">meta</span><span class="o">.</span><span class="n">auto_created</span><span class="p">:</span>
<span class="n">pre_save</span><span class="o">.</span><span class="n">send</span><span class="p">(</span>
<span class="n">sender</span><span class="o">=</span><span class="n">origin</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="n">raw</span><span class="o">=</span><span class="n">raw</span><span class="p">,</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="n">update_fields</span><span class="o">=</span><span class="n">update_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># A transaction isn&#39;t needed if one query is issued.</span>
<span class="k">if</span> <span class="n">meta</span><span class="o">.</span><span class="n">parents</span><span class="p">:</span>
<span class="n">context_manager</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">atomic</span><span class="p">(</span><span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span> <span class="n">savepoint</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">context_manager</span> <span class="o">=</span> <span class="n">transaction</span><span class="o">.</span><span class="n">mark_for_rollback_on_error</span><span class="p">(</span><span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">)</span>
<span class="k">with</span> <span class="n">context_manager</span><span class="p">:</span>
<span class="n">parent_inserted</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">raw</span><span class="p">:</span>
<span class="c1"># Validate force insert only when parents are inserted.</span>
<span class="n">force_insert</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_validate_force_insert</span><span class="p">(</span><span class="n">force_insert</span><span class="p">)</span>
<span class="n">parent_inserted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_parents</span><span class="p">(</span>
<span class="bp">cls</span><span class="p">,</span> <span class="n">using</span><span class="p">,</span> <span class="n">update_fields</span><span class="p">,</span> <span class="n">force_insert</span>
<span class="p">)</span>
<span class="n">updated</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_table</span><span class="p">(</span>
<span class="n">raw</span><span class="p">,</span>
<span class="bp">cls</span><span class="p">,</span>
<span class="n">force_insert</span> <span class="ow">or</span> <span class="n">parent_inserted</span><span class="p">,</span>
<span class="n">force_update</span><span class="p">,</span>
<span class="n">using</span><span class="p">,</span>
<span class="n">update_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Store the database on which the object was saved</span>
<span class="bp">self</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">using</span>
<span class="c1"># Once saved, this is no longer a to-be-added instance.</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="o">=</span> <span class="kc">False</span>
<span class="c1"># Signal that the save is complete</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">meta</span><span class="o">.</span><span class="n">auto_created</span><span class="p">:</span>
<span class="n">post_save</span><span class="o">.</span><span class="n">send</span><span class="p">(</span>
<span class="n">sender</span><span class="o">=</span><span class="n">origin</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="n">created</span><span class="o">=</span><span class="p">(</span><span class="ow">not</span> <span class="n">updated</span><span class="p">),</span>
<span class="n">update_fields</span><span class="o">=</span><span class="n">update_fields</span><span class="p">,</span>
<span class="n">raw</span><span class="o">=</span><span class="n">raw</span><span class="p">,</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">save_base</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_save_parents</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">using</span><span class="p">,</span> <span class="n">update_fields</span><span class="p">,</span> <span class="n">force_insert</span><span class="p">,</span> <span class="n">updated_parents</span><span class="o">=</span><span class="kc">None</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Save all the parents of cls using values from self.&quot;&quot;&quot;</span>
<span class="n">meta</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">inserted</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">updated_parents</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">updated_parents</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">parent</span><span class="p">,</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">parents</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># Make sure the link fields are synced between parent and self.</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">field</span>
<span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">))</span>
<span class="k">if</span> <span class="p">(</span><span class="n">parent_updated</span> <span class="o">:=</span> <span class="n">updated_parents</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">parent</span><span class="p">))</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">parent_inserted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_parents</span><span class="p">(</span>
<span class="bp">cls</span><span class="o">=</span><span class="n">parent</span><span class="p">,</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="n">update_fields</span><span class="o">=</span><span class="n">update_fields</span><span class="p">,</span>
<span class="n">force_insert</span><span class="o">=</span><span class="n">force_insert</span><span class="p">,</span>
<span class="n">updated_parents</span><span class="o">=</span><span class="n">updated_parents</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">updated</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_table</span><span class="p">(</span>
<span class="bp">cls</span><span class="o">=</span><span class="n">parent</span><span class="p">,</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="n">update_fields</span><span class="o">=</span><span class="n">update_fields</span><span class="p">,</span>
<span class="n">force_insert</span><span class="o">=</span><span class="n">parent_inserted</span> <span class="ow">or</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">force_insert</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">updated</span><span class="p">:</span>
<span class="n">inserted</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">updated_parents</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span> <span class="o">=</span> <span class="n">updated</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">parent_updated</span><span class="p">:</span>
<span class="n">inserted</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># Set the parent&#39;s PK value to self.</span>
<span class="k">if</span> <span class="n">field</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">(</span><span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="p">))</span>
<span class="c1"># Since we didn&#39;t have an instance of the parent handy set</span>
<span class="c1"># attname directly, bypassing the descriptor. Invalidate</span>
<span class="c1"># the related object cache, in case it&#39;s been accidentally</span>
<span class="c1"># populated. A fresh instance will be re-built from the</span>
<span class="c1"># database if necessary.</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">field</span><span class="o">.</span><span class="n">delete_cached_value</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="n">inserted</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_save_table</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">raw</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="bp">cls</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">force_insert</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">force_update</span><span class="o">=</span><span class="kc">False</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">update_fields</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Do the heavy-lifting involved in saving. Update or insert the data</span>
<span class="sd"> for a single table.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">meta</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">pk_fields</span> <span class="o">=</span> <span class="n">meta</span><span class="o">.</span><span class="n">pk_fields</span>
<span class="n">non_pks_non_generated</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">f</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">local_concrete_fields</span>
<span class="k">if</span> <span class="n">f</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">pk_fields</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">f</span><span class="o">.</span><span class="n">generated</span>
<span class="p">]</span>
<span class="k">if</span> <span class="n">update_fields</span><span class="p">:</span>
<span class="n">non_pks_non_generated</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">f</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">non_pks_non_generated</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">update_fields</span> <span class="ow">or</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span> <span class="ow">in</span> <span class="n">update_fields</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">(</span><span class="n">meta</span><span class="p">):</span>
<span class="n">pk_val</span> <span class="o">=</span> <span class="n">meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">get_pk_value_on_save</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">pk_val</span><span class="p">)</span>
<span class="n">pk_set</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">(</span><span class="n">meta</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">pk_set</span> <span class="ow">and</span> <span class="p">(</span><span class="n">force_update</span> <span class="ow">or</span> <span class="n">update_fields</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Cannot force an update in save() with no primary key.&quot;</span><span class="p">)</span>
<span class="n">updated</span> <span class="o">=</span> <span class="kc">False</span>
<span class="c1"># Skip an UPDATE when adding an instance and primary key has a default.</span>
<span class="k">if</span> <span class="p">(</span>
<span class="ow">not</span> <span class="n">raw</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="n">force_insert</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="n">force_update</span>
<span class="ow">and</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="nb">all</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">has_default</span><span class="p">()</span> <span class="ow">or</span> <span class="n">f</span><span class="o">.</span><span class="n">has_db_default</span><span class="p">()</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">pk_fields</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">force_insert</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># If possible, try an UPDATE. If that doesn&#39;t update anything, do an</span>
<span class="c1"># INSERT.</span>
<span class="k">if</span> <span class="n">pk_set</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">force_insert</span><span class="p">:</span>
<span class="n">base_qs</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_base_manager</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">using</span><span class="p">)</span>
<span class="n">values</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">(</span>
<span class="n">f</span><span class="p">,</span>
<span class="kc">None</span><span class="p">,</span>
<span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="k">if</span> <span class="n">raw</span> <span class="k">else</span> <span class="n">f</span><span class="o">.</span><span class="n">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">False</span><span class="p">)),</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">non_pks_non_generated</span>
<span class="p">]</span>
<span class="n">forced_update</span> <span class="o">=</span> <span class="n">update_fields</span> <span class="ow">or</span> <span class="n">force_update</span>
<span class="n">pk_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">(</span><span class="n">meta</span><span class="p">)</span>
<span class="n">returning_fields</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">f</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">local_concrete_fields</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">f</span><span class="o">.</span><span class="n">generated</span>
<span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">referenced_fields</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">non_pks_non_generated</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">for</span> <span class="n">field</span><span class="p">,</span> <span class="n">_model</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">update_fields</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">update_fields</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span>
<span class="n">value</span><span class="p">,</span> <span class="s2">&quot;resolve_expression&quot;</span>
<span class="p">):</span>
<span class="n">returning_fields</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_do_update</span><span class="p">(</span>
<span class="n">base_qs</span><span class="p">,</span>
<span class="n">using</span><span class="p">,</span>
<span class="n">pk_val</span><span class="p">,</span>
<span class="n">values</span><span class="p">,</span>
<span class="n">update_fields</span><span class="p">,</span>
<span class="n">forced_update</span><span class="p">,</span>
<span class="n">returning_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">updated</span> <span class="o">:=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">results</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_assign_returned_values</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">returning_fields</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">force_update</span><span class="p">:</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">NotUpdated</span><span class="p">(</span><span class="s2">&quot;Forced update did not affect any rows.&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">update_fields</span><span class="p">:</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">NotUpdated</span><span class="p">(</span>
<span class="s2">&quot;Save with update_fields did not affect any rows.&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">updated</span><span class="p">:</span>
<span class="k">if</span> <span class="n">meta</span><span class="o">.</span><span class="n">order_with_respect_to</span><span class="p">:</span>
<span class="c1"># If this is a model with an order_with_respect_to</span>
<span class="c1"># autopopulate the _order field</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">meta</span><span class="o">.</span><span class="n">order_with_respect_to</span>
<span class="n">filter_args</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">get_filter_kwargs_for_object</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_order</span> <span class="o">=</span> <span class="p">(</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_base_manager</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">using</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">filter_args</span><span class="p">)</span>
<span class="o">.</span><span class="n">aggregate</span><span class="p">(</span>
<span class="n">_order__max</span><span class="o">=</span><span class="n">Coalesce</span><span class="p">(</span>
<span class="n">ExpressionWrapper</span><span class="p">(</span>
<span class="n">Max</span><span class="p">(</span><span class="s2">&quot;_order&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">Value</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">output_field</span><span class="o">=</span><span class="n">IntegerField</span><span class="p">()</span>
<span class="p">),</span>
<span class="n">Value</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
<span class="p">),</span>
<span class="p">)[</span><span class="s2">&quot;_order__max&quot;</span><span class="p">]</span>
<span class="p">)</span>
<span class="n">insert_fields</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">f</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">local_concrete_fields</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">f</span><span class="o">.</span><span class="n">generated</span> <span class="ow">and</span> <span class="p">(</span><span class="n">pk_set</span> <span class="ow">or</span> <span class="n">f</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">meta</span><span class="o">.</span><span class="n">auto_field</span><span class="p">)</span>
<span class="p">]</span>
<span class="n">returning_fields</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">meta</span><span class="o">.</span><span class="n">db_returning_fields</span><span class="p">)</span>
<span class="n">can_return_columns_from_insert</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span>
<span class="n">using</span>
<span class="p">]</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">can_return_columns_from_insert</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">insert_fields</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">if</span> <span class="n">raw</span>
<span class="k">else</span> <span class="n">field</span><span class="o">.</span><span class="n">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">add</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;resolve_expression&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">returning_fields</span><span class="p">:</span>
<span class="n">returning_fields</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">elif</span> <span class="p">(</span>
<span class="n">field</span><span class="o">.</span><span class="n">db_returning</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="n">can_return_columns_from_insert</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span><span class="n">pk_set</span> <span class="ow">and</span> <span class="n">field</span> <span class="ow">is</span> <span class="n">meta</span><span class="o">.</span><span class="n">auto_field</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">returning_fields</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_do_insert</span><span class="p">(</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_base_manager</span><span class="p">,</span> <span class="n">using</span><span class="p">,</span> <span class="n">insert_fields</span><span class="p">,</span> <span class="n">returning_fields</span><span class="p">,</span> <span class="n">raw</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">results</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_assign_returned_values</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">returning_fields</span><span class="p">)</span>
<span class="k">return</span> <span class="n">updated</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_do_update</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">base_qs</span><span class="p">,</span>
<span class="n">using</span><span class="p">,</span>
<span class="n">pk_val</span><span class="p">,</span>
<span class="n">values</span><span class="p">,</span>
<span class="n">update_fields</span><span class="p">,</span>
<span class="n">forced_update</span><span class="p">,</span>
<span class="n">returning_fields</span><span class="p">,</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Try to update the model. Return True if the model was updated (if an</span>
<span class="sd"> update query was done and a matching row was found in the DB).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">filtered</span> <span class="o">=</span> <span class="n">base_qs</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">pk_val</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">values</span><span class="p">:</span>
<span class="c1"># We can end up here when saving a model in inheritance chain where</span>
<span class="c1"># update_fields doesn&#39;t target any field in current model. In that</span>
<span class="c1"># case we just say the update succeeded. Another case ending up</span>
<span class="c1"># here is a model with just PK - in that case check that the PK</span>
<span class="c1"># still exists.</span>
<span class="k">if</span> <span class="n">update_fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">filtered</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[()]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">select_on_save</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">forced_update</span><span class="p">:</span>
<span class="c1"># It may happen that the object is deleted from the DB right after</span>
<span class="c1"># this check, causing the subsequent UPDATE to return zero matching</span>
<span class="c1"># rows. The same result can occur in some rare cases when the</span>
<span class="c1"># database returns zero despite the UPDATE being executed</span>
<span class="c1"># successfully (a row is matched and updated). In order to</span>
<span class="c1"># distinguish these two cases, the object&#39;s existence in the</span>
<span class="c1"># database is again checked for if the UPDATE query returns 0.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">filtered</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">results</span> <span class="o">:=</span> <span class="n">filtered</span><span class="o">.</span><span class="n">_update</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">returning_fields</span><span class="p">):</span>
<span class="k">return</span> <span class="n">results</span>
<span class="k">return</span> <span class="p">[()]</span> <span class="k">if</span> <span class="n">filtered</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="k">else</span> <span class="p">[]</span>
<span class="k">return</span> <span class="n">filtered</span><span class="o">.</span><span class="n">_update</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">returning_fields</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_do_insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">manager</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="n">returning_fields</span><span class="p">,</span> <span class="n">raw</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Do an INSERT. If returning_fields is defined then this method should</span>
<span class="sd"> return the newly created data for the model.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">manager</span><span class="o">.</span><span class="n">_insert</span><span class="p">(</span>
<span class="p">[</span><span class="bp">self</span><span class="p">],</span>
<span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">,</span>
<span class="n">returning_fields</span><span class="o">=</span><span class="n">returning_fields</span><span class="p">,</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="n">raw</span><span class="o">=</span><span class="n">raw</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_assign_returned_values</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">returned_values</span><span class="p">,</span> <span class="n">returning_fields</span><span class="p">):</span>
<span class="n">returning_fields_iter</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">returning_fields</span><span class="p">)</span>
<span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">field</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">returned_values</span><span class="p">,</span> <span class="n">returning_fields_iter</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="c1"># Defer all fields that were meant to be updated with their database</span>
<span class="c1"># resolved values but couldn&#39;t as they are effectively stale.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">returning_fields_iter</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_prepare_related_fields_for_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">operation_name</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="c1"># Ensure that a model instance without a PK hasn&#39;t been assigned to</span>
<span class="c1"># a ForeignKey, GenericForeignKey or OneToOneField on this model. If</span>
<span class="c1"># the field is nullable, allowing the save would result in silent data</span>
<span class="c1"># loss.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">fields</span> <span class="ow">and</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># If the related field isn&#39;t cached, then an instance hasn&#39;t been</span>
<span class="c1"># assigned and there&#39;s no need to worry about this check.</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">is_relation</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># A pk may have been assigned manually to a model instance not</span>
<span class="c1"># saved to the database (or auto-generated in a case like</span>
<span class="c1"># UUIDField), but we allow the save to proceed and rely on the</span>
<span class="c1"># database to raise an IntegrityError if applicable. If</span>
<span class="c1"># constraints aren&#39;t supported by the database, there&#39;s the</span>
<span class="c1"># unavoidable risk of data corruption.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">():</span>
<span class="c1"># Remove the object from a related instance cache.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">multiple</span><span class="p">:</span>
<span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">delete_cached_value</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">() prohibited to prevent data loss due to unsaved &quot;</span>
<span class="s2">&quot;related object &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">operation_name</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="ow">in</span> <span class="n">field</span><span class="o">.</span><span class="n">empty_values</span><span class="p">:</span>
<span class="c1"># Set related object if it has been saved after an</span>
<span class="c1"># assignment.</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="c1"># If the relationship&#39;s pk/to_field was changed, clear the</span>
<span class="c1"># cached relationship.</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">target_field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">getattr</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span>
<span class="p">):</span>
<span class="n">field</span><span class="o">.</span><span class="n">delete_cached_value</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="c1"># GenericForeignKeys are private.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">private_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">fields</span> <span class="ow">and</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">field</span><span class="o">.</span><span class="n">is_relation</span>
<span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;fk_field&quot;</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">get_cached_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">obj</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">():</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">operation_name</span><span class="si">}</span><span class="s2">() prohibited to prevent data loss due to &quot;</span>
<span class="sa">f</span><span class="s2">&quot;unsaved related object &#39;</span><span class="si">{</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39;.&quot;</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">delete</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">keep_parents</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">():</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> object can&#39;t be deleted because its </span><span class="si">%s</span><span class="s2"> attribute is set &quot;</span>
<span class="s2">&quot;to None.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">using</span> <span class="o">=</span> <span class="n">using</span> <span class="ow">or</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="n">collector</span> <span class="o">=</span> <span class="n">Collector</span><span class="p">(</span><span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span> <span class="n">origin</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="n">collector</span><span class="o">.</span><span class="n">collect</span><span class="p">([</span><span class="bp">self</span><span class="p">],</span> <span class="n">keep_parents</span><span class="o">=</span><span class="n">keep_parents</span><span class="p">)</span>
<span class="k">return</span> <span class="n">collector</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="n">delete</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">adelete</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">keep_parents</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">return</span> <span class="k">await</span> <span class="n">sync_to_async</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delete</span><span class="p">)(</span>
<span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">,</span>
<span class="n">keep_parents</span><span class="o">=</span><span class="n">keep_parents</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">adelete</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_FIELD_display</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="n">choices_dict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">make_hashable</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">flatchoices</span><span class="p">))</span>
<span class="c1"># force_str() to coerce lazy strings.</span>
<span class="k">return</span> <span class="n">force_str</span><span class="p">(</span>
<span class="n">choices_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">make_hashable</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">value</span><span class="p">),</span> <span class="n">strings_only</span><span class="o">=</span><span class="kc">True</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_next_or_previous_by_FIELD</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">is_next</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">():</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;get_next/get_previous cannot be used on unsaved objects.&quot;</span><span class="p">)</span>
<span class="n">op</span> <span class="o">=</span> <span class="s2">&quot;gt&quot;</span> <span class="k">if</span> <span class="n">is_next</span> <span class="k">else</span> <span class="s2">&quot;lt&quot;</span>
<span class="n">order</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">is_next</span> <span class="k">else</span> <span class="s2">&quot;-&quot;</span>
<span class="n">param</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="n">q</span> <span class="o">=</span> <span class="n">Q</span><span class="o">.</span><span class="n">create</span><span class="p">([(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">),</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;pk__</span><span class="si">{</span><span class="n">op</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">)],</span> <span class="n">connector</span><span class="o">=</span><span class="n">Q</span><span class="o">.</span><span class="n">AND</span><span class="p">)</span>
<span class="n">q</span> <span class="o">=</span> <span class="n">Q</span><span class="o">.</span><span class="n">create</span><span class="p">([</span><span class="n">q</span><span class="p">,</span> <span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">op</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">param</span><span class="p">)],</span> <span class="n">connector</span><span class="o">=</span><span class="n">Q</span><span class="o">.</span><span class="n">OR</span><span class="p">)</span>
<span class="n">qs</span> <span class="o">=</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">q</span><span class="p">)</span>
<span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">order</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">),</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">pk&quot;</span> <span class="o">%</span> <span class="n">order</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">qs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> matching query does not exist.&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_next_or_previous_in_order</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">is_next</span><span class="p">):</span>
<span class="n">cachename</span> <span class="o">=</span> <span class="s2">&quot;__</span><span class="si">%s</span><span class="s2">_order_cache&quot;</span> <span class="o">%</span> <span class="n">is_next</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cachename</span><span class="p">):</span>
<span class="n">op</span> <span class="o">=</span> <span class="s2">&quot;gt&quot;</span> <span class="k">if</span> <span class="n">is_next</span> <span class="k">else</span> <span class="s2">&quot;lt&quot;</span>
<span class="n">order</span> <span class="o">=</span> <span class="s2">&quot;_order&quot;</span> <span class="k">if</span> <span class="n">is_next</span> <span class="k">else</span> <span class="s2">&quot;-_order&quot;</span>
<span class="n">order_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">order_with_respect_to</span>
<span class="n">filter_args</span> <span class="o">=</span> <span class="n">order_field</span><span class="o">.</span><span class="n">get_filter_kwargs_for_object</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">filter_args</span><span class="p">)</span>
<span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;_order__</span><span class="si">%s</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="n">op</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">values</span><span class="p">(</span><span class="s2">&quot;_order&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">}</span>
<span class="p">)</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="n">order</span><span class="p">)[:</span><span class="mi">1</span><span class="p">]</span>
<span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cachename</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cachename</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_field_expression_map</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">meta</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">meta</span> <span class="o">=</span> <span class="n">meta</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">field_map</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">generated_fields</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">generated</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span>
<span class="n">ref</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">exclude</span>
<span class="k">for</span> <span class="n">ref</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_expr_references</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">expression</span><span class="p">)</span>
<span class="p">):</span>
<span class="k">continue</span>
<span class="n">generated_fields</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="p">(</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="n">ForeignObjectRel</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">local_concrete_fields</span>
<span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">from_field</span><span class="p">)</span> <span class="k">for</span> <span class="n">from_field</span> <span class="ow">in</span> <span class="n">field</span><span class="o">.</span><span class="n">from_fields</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">field</span><span class="o">.</span><span class="n">concrete</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">value</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;resolve_expression&quot;</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">Value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="n">field_map</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">field_map</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">if</span> <span class="s2">&quot;pk&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">field_map</span><span class="p">[</span><span class="s2">&quot;pk&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Value</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">,</span> <span class="n">meta</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="k">if</span> <span class="n">generated_fields</span><span class="p">:</span>
<span class="n">replacements</span> <span class="o">=</span> <span class="p">{</span><span class="n">F</span><span class="p">(</span><span class="n">name</span><span class="p">):</span> <span class="n">value</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">field_map</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
<span class="k">for</span> <span class="n">generated_field</span> <span class="ow">in</span> <span class="n">generated_fields</span><span class="p">:</span>
<span class="n">field_map</span><span class="p">[</span><span class="n">generated_field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">ExpressionWrapper</span><span class="p">(</span>
<span class="n">generated_field</span><span class="o">.</span><span class="n">expression</span><span class="o">.</span><span class="n">replace_expressions</span><span class="p">(</span><span class="n">replacements</span><span class="p">),</span>
<span class="n">generated_field</span><span class="o">.</span><span class="n">output_field</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">field_map</span>
<span class="k">def</span><span class="w"> </span><span class="nf">prepare_database_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">():</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Unsaved model instance </span><span class="si">%r</span><span class="s2"> cannot be used in an ORM query.&quot;</span> <span class="o">%</span> <span class="bp">self</span>
<span class="p">)</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">get_related_field</span><span class="p">()</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<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>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook for doing any extra model-wide validation after clean() has been</span>
<span class="sd"> called on every field by self.clean_fields. Any ValidationError raised</span>
<span class="sd"> by this method will not be associated with a particular field; it will</span>
<span class="sd"> have a special-case association with the field defined by</span>
<span class="sd"> NON_FIELD_ERRORS.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate_unique</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>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check unique constraints on the model and raise ValidationError if any</span>
<span class="sd"> failed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">unique_checks</span><span class="p">,</span> <span class="n">date_checks</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_unique_checks</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="n">exclude</span><span class="p">)</span>
<span class="n">errors</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_perform_unique_checks</span><span class="p">(</span><span class="n">unique_checks</span><span class="p">)</span>
<span class="n">date_errors</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_perform_date_checks</span><span class="p">(</span><span class="n">date_checks</span><span class="p">)</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">date_errors</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">errors</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_unique_checks</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> <span class="n">include_meta_constraints</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a list of checks to perform. Since validate_unique() could be</span>
<span class="sd"> called from a ModelForm, some fields may have been excluded; we can&#39;t</span>
<span class="sd"> perform a unique check on a model that is missing fields involved</span>
<span class="sd"> in that check. Fields that did not validate should also be excluded,</span>
<span class="sd"> but they need to be passed in via the exclude argument.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">unique_checks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">unique_togethers</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">unique_together</span><span class="p">)]</span>
<span class="n">constraints</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">include_meta_constraints</span><span class="p">:</span>
<span class="n">constraints</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">total_unique_constraints</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">parent_class</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">all_parents</span><span class="p">:</span>
<span class="k">if</span> <span class="n">parent_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">unique_together</span><span class="p">:</span>
<span class="n">unique_togethers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">(</span><span class="n">parent_class</span><span class="p">,</span> <span class="n">parent_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">unique_together</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">include_meta_constraints</span> <span class="ow">and</span> <span class="n">parent_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">total_unique_constraints</span><span class="p">:</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">(</span><span class="n">parent_class</span><span class="p">,</span> <span class="n">parent_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">total_unique_constraints</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">model_class</span><span class="p">,</span> <span class="n">unique_together</span> <span class="ow">in</span> <span class="n">unique_togethers</span><span class="p">:</span>
<span class="k">for</span> <span class="n">check</span> <span class="ow">in</span> <span class="n">unique_together</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">name</span> <span class="ow">in</span> <span class="n">exclude</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">check</span><span class="p">):</span>
<span class="c1"># Add the check if the field isn&#39;t excluded.</span>
<span class="n">unique_checks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">model_class</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">check</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">include_meta_constraints</span><span class="p">:</span>
<span class="k">for</span> <span class="n">model_class</span><span class="p">,</span> <span class="n">model_constraints</span> <span class="ow">in</span> <span class="n">constraints</span><span class="p">:</span>
<span class="k">for</span> <span class="n">constraint</span> <span class="ow">in</span> <span class="n">model_constraints</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">name</span> <span class="ow">in</span> <span class="n">exclude</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">constraint</span><span class="o">.</span><span class="n">fields</span><span class="p">):</span>
<span class="n">unique_checks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">model_class</span><span class="p">,</span> <span class="n">constraint</span><span class="o">.</span><span class="n">fields</span><span class="p">))</span>
<span class="c1"># These are checks for the unique_for_&lt;date/year/month&gt;.</span>
<span class="n">date_checks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># Gather a list of checks for fields declared as unique and add them to</span>
<span class="c1"># the list of checks.</span>
<span class="n">fields_with_class</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">parent_class</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">all_parents</span><span class="p">:</span>
<span class="n">fields_with_class</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">parent_class</span><span class="p">,</span> <span class="n">parent_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">))</span>
<span class="k">for</span> <span class="n">model_class</span><span class="p">,</span> <span class="n">fields</span> <span class="ow">in</span> <span class="n">fields_with_class</span><span class="p">:</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">name</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">CompositePrimaryKey</span><span class="p">):</span>
<span class="n">names</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">fields</span><span class="p">)</span>
<span class="k">if</span> <span class="n">exclude</span><span class="o">.</span><span class="n">isdisjoint</span><span class="p">(</span><span class="n">names</span><span class="p">):</span>
<span class="n">unique_checks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">model_class</span><span class="p">,</span> <span class="n">names</span><span class="p">))</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">unique</span><span class="p">:</span>
<span class="n">unique_checks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">model_class</span><span class="p">,</span> <span class="p">(</span><span class="n">name</span><span class="p">,)))</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_date</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_date</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">date_checks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">model_class</span><span class="p">,</span> <span class="s2">&quot;date&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_date</span><span class="p">))</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_year</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_year</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">date_checks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">model_class</span><span class="p">,</span> <span class="s2">&quot;year&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_year</span><span class="p">))</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_month</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_month</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">date_checks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">model_class</span><span class="p">,</span> <span class="s2">&quot;month&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">unique_for_month</span><span class="p">))</span>
<span class="k">return</span> <span class="n">unique_checks</span><span class="p">,</span> <span class="n">date_checks</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_perform_unique_checks</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unique_checks</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">model_class</span><span class="p">,</span> <span class="n">unique_check</span> <span class="ow">in</span> <span class="n">unique_checks</span><span class="p">:</span>
<span class="c1"># Try to look up an existing object with the same values as this</span>
<span class="c1"># object&#39;s values for all the unique field.</span>
<span class="n">lookup_kwargs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">unique_check</span><span class="p">:</span>
<span class="n">f</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="n">lookup_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="c1"># TODO: Handle multiple backends with different feature flags.</span>
<span class="k">if</span> <span class="n">lookup_value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="p">(</span>
<span class="n">lookup_value</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span>
<span class="ow">and</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">interprets_empty_strings_as_nulls</span>
<span class="p">):</span>
<span class="c1"># no value, skip the lookup</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk_fields</span> <span class="ow">and</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="p">:</span>
<span class="c1"># no need to check for unique primary key when editing</span>
<span class="k">continue</span>
<span class="n">lookup_kwargs</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">field_name</span><span class="p">)]</span> <span class="o">=</span> <span class="n">lookup_value</span>
<span class="c1"># some fields were skipped, no reason to do the check</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">unique_check</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lookup_kwargs</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">lookup_kwargs</span><span class="p">)</span>
<span class="c1"># Exclude the current object from the query if we are editing an</span>
<span class="c1"># instance (as opposed to creating a new one)</span>
<span class="c1"># Note that we need to use the pk as defined by model_class, not</span>
<span class="c1"># self.pk. These can be different fields because model inheritance</span>
<span class="c1"># allows single model to have effectively multiple primary keys.</span>
<span class="c1"># Refs #17615.</span>
<span class="n">model_class_pk</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">(</span><span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="p">)</span>
<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="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">(</span><span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="p">):</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">qs</span><span class="o">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">model_class_pk</span><span class="p">)</span>
<span class="k">if</span> <span class="n">qs</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">unique_check</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">unique_check</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">NON_FIELD_ERRORS</span>
<span class="n">errors</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unique_error_message</span><span class="p">(</span><span class="n">model_class</span><span class="p">,</span> <span class="n">unique_check</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_perform_date_checks</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">date_checks</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">model_class</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">unique_for</span> <span class="ow">in</span> <span class="n">date_checks</span><span class="p">:</span>
<span class="n">lookup_kwargs</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># there&#39;s a ticket to add a date lookup, we can remove this special</span>
<span class="c1"># case if that makes it&#39;s way in</span>
<span class="n">date</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unique_for</span><span class="p">)</span>
<span class="k">if</span> <span class="n">date</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">lookup_type</span> <span class="o">==</span> <span class="s2">&quot;date&quot;</span><span class="p">:</span>
<span class="n">lookup_kwargs</span><span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__day&quot;</span> <span class="o">%</span> <span class="n">unique_for</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">day</span>
<span class="n">lookup_kwargs</span><span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__month&quot;</span> <span class="o">%</span> <span class="n">unique_for</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">month</span>
<span class="n">lookup_kwargs</span><span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__year&quot;</span> <span class="o">%</span> <span class="n">unique_for</span><span class="p">]</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">year</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lookup_kwargs</span><span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">unique_for</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span>
<span class="n">date</span><span class="p">,</span> <span class="n">lookup_type</span>
<span class="p">)</span>
<span class="n">lookup_kwargs</span><span class="p">[</span><span class="n">field</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">lookup_kwargs</span><span class="p">)</span>
<span class="c1"># Exclude the current object from the query if we are editing an</span>
<span class="c1"># instance (as opposed to creating a new one)</span>
<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="bp">self</span><span class="o">.</span><span class="n">_is_pk_set</span><span class="p">():</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">qs</span><span class="o">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="k">if</span> <span class="n">qs</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="n">errors</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">date_error_message</span><span class="p">(</span><span class="n">lookup_type</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">unique_for</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">date_error_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">unique_for</span><span class="p">):</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ValidationError</span><span class="p">(</span>
<span class="n">message</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;unique_for_date&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;unique_for_date&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span>
<span class="s2">&quot;model_name&quot;</span><span class="p">:</span> <span class="n">capfirst</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">),</span>
<span class="s2">&quot;lookup_type&quot;</span><span class="p">:</span> <span class="n">lookup_type</span><span class="p">,</span>
<span class="s2">&quot;field&quot;</span><span class="p">:</span> <span class="n">field_name</span><span class="p">,</span>
<span class="s2">&quot;field_label&quot;</span><span class="p">:</span> <span class="n">capfirst</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">),</span>
<span class="s2">&quot;date_field&quot;</span><span class="p">:</span> <span class="n">unique_for</span><span class="p">,</span>
<span class="s2">&quot;date_field_label&quot;</span><span class="p">:</span> <span class="n">capfirst</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">unique_for</span><span class="p">)</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">),</span>
<span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">unique_error_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_class</span><span class="p">,</span> <span class="n">unique_check</span><span class="p">):</span>
<span class="n">opts</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span>
<span class="s2">&quot;model_class&quot;</span><span class="p">:</span> <span class="n">model_class</span><span class="p">,</span>
<span class="s2">&quot;model_name&quot;</span><span class="p">:</span> <span class="n">capfirst</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">),</span>
<span class="s2">&quot;unique_check&quot;</span><span class="p">:</span> <span class="n">unique_check</span><span class="p">,</span>
<span class="p">}</span>
<span class="c1"># A unique field</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">unique_check</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">unique_check</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;field_label&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">capfirst</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ValidationError</span><span class="p">(</span>
<span class="n">message</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;unique&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;unique&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># unique_together</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">field_labels</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">capfirst</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">f</span><span class="p">)</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">unique_check</span>
<span class="p">]</span>
<span class="n">params</span><span class="p">[</span><span class="s2">&quot;field_labels&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_text_list</span><span class="p">(</span><span class="n">field_labels</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;and&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">ValidationError</span><span class="p">(</span>
<span class="n">message</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(model_name)s</span><span class="s2"> with this </span><span class="si">%(field_labels)s</span><span class="s2"> already exists.&quot;</span><span class="p">),</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;unique_together&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_constraints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">constraints</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">constraints</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">parent_class</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">all_parents</span><span class="p">:</span>
<span class="k">if</span> <span class="n">parent_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">constraints</span><span class="p">:</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">parent_class</span><span class="p">,</span> <span class="n">parent_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">constraints</span><span class="p">))</span>
<span class="k">return</span> <span class="n">constraints</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate_constraints</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>
<span class="n">constraints</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_constraints</span><span class="p">()</span>
<span class="n">using</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">model_class</span><span class="p">,</span> <span class="n">model_constraints</span> <span class="ow">in</span> <span class="n">constraints</span><span class="p">:</span>
<span class="k">for</span> <span class="n">constraint</span> <span class="ow">in</span> <span class="n">model_constraints</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">constraint</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">model_class</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="n">exclude</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="n">using</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;code&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;unique&quot;</span>
<span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">constraint</span><span class="o">.</span><span class="n">fields</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">constraint</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">errors</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">update_error_dict</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">full_clean</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> <span class="n">validate_unique</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">validate_constraints</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Call clean_fields(), clean(), validate_unique(), and</span>
<span class="sd"> validate_constraints() on the model. Raise a ValidationError for any</span>
<span class="sd"> errors that occur.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">exclude</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</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>
<span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">errors</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">update_error_dict</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="c1"># Form.clean() is run even if other validation fails, so do the</span>
<span class="c1"># same with Model.clean() for consistency.</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clean</span><span class="p">()</span>
<span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">errors</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">update_error_dict</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="c1"># Run unique checks, but only for fields that passed validation.</span>
<span class="k">if</span> <span class="n">validate_unique</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">!=</span> <span class="n">NON_FIELD_ERRORS</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">exclude</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">validate_unique</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="n">exclude</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">errors</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">update_error_dict</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="c1"># Run constraints checks, but only for fields that passed validation.</span>
<span class="k">if</span> <span class="n">validate_constraints</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">!=</span> <span class="n">NON_FIELD_ERRORS</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
<span class="n">exclude</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">validate_constraints</span><span class="p">(</span><span class="n">exclude</span><span class="o">=</span><span class="n">exclude</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">errors</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">update_error_dict</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<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>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Clean all fields and raise a ValidationError containing a dict</span>
<span class="sd"> of all validation errors if any occur.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">exclude</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">exclude</span> <span class="ow">or</span> <span class="n">f</span><span class="o">.</span><span class="n">generated</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># Skip validation for empty fields with blank=True. The developer</span>
<span class="c1"># is responsible for making sure they have a valid value.</span>
<span class="n">raw_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">blank</span> <span class="ow">and</span> <span class="n">raw_value</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">empty_values</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># Skip validation for empty fields when db_default is used.</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">raw_value</span><span class="p">,</span> <span class="n">DatabaseDefault</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">clean</span><span class="p">(</span><span class="n">raw_value</span><span class="p">,</span> <span class="bp">self</span><span class="p">))</span>
<span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">errors</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">error_list</span>
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_swappable</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_model</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_managers</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">swapped</span><span class="p">:</span>
<span class="n">databases</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;databases&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="n">errors</span> <span class="o">+=</span> <span class="p">[</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_fields</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_m2m_through_same_relationship</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_long_column_names</span><span class="p">(</span><span class="n">databases</span><span class="p">),</span>
<span class="p">]</span>
<span class="n">clash_errors</span> <span class="o">=</span> <span class="p">(</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_id_field</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_field_name_clashes</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_model_name_db_lookup_clashes</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_property_name_related_field_accessor_clashes</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_single_primary_key</span><span class="p">(),</span>
<span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">clash_errors</span><span class="p">)</span>
<span class="c1"># If there are field name clashes, hide consequent column name</span>
<span class="c1"># clashes.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">clash_errors</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_column_name_clashes</span><span class="p">())</span>
<span class="n">errors</span> <span class="o">+=</span> <span class="p">[</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_unique_together</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_indexes</span><span class="p">(</span><span class="n">databases</span><span class="p">),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_ordering</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_constraints</span><span class="p">(</span><span class="n">databases</span><span class="p">),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_db_table_comment</span><span class="p">(</span><span class="n">databases</span><span class="p">),</span>
<span class="o">*</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_composite_pk</span><span class="p">(),</span>
<span class="p">]</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_composite_pk</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">meta</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">pk</span> <span class="o">=</span> <span class="n">meta</span><span class="o">.</span><span class="n">pk</span>
<span class="k">if</span> <span class="n">meta</span><span class="o">.</span><span class="n">proxy</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pk</span><span class="p">,</span> <span class="n">CompositePrimaryKey</span><span class="p">):</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="n">seen_columns</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">pk</span><span class="o">.</span><span class="n">field_names</span><span class="p">:</span>
<span class="n">hint</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span>
<span class="n">field</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">field</span><span class="p">:</span>
<span class="n">hint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> is not a valid field.&quot;</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">field</span><span class="o">.</span><span class="n">column</span><span class="p">:</span>
<span class="n">hint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> field has no column.&quot;</span>
<span class="k">elif</span> <span class="n">field</span><span class="o">.</span><span class="n">null</span><span class="p">:</span>
<span class="n">hint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> field may not set &#39;null=True&#39;.&quot;</span>
<span class="k">elif</span> <span class="n">field</span><span class="o">.</span><span class="n">generated</span><span class="p">:</span>
<span class="n">hint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> field is a generated field.&quot;</span>
<span class="k">elif</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">:</span>
<span class="n">hint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> field is not a local field.&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">seen_columns</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">column</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">hint</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> cannot be included in the composite primary &quot;</span>
<span class="s2">&quot;key.&quot;</span><span class="p">,</span>
<span class="n">hint</span><span class="o">=</span><span class="n">hint</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E042&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">field_names</span> <span class="ow">in</span> <span class="n">seen_columns</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">field_names</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">field_name</span><span class="p">,</span> <span class="o">*</span><span class="n">rest</span> <span class="o">=</span> <span class="n">field_names</span>
<span class="n">duplicates</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">field</span><span class="p">)</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">rest</span><span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">duplicates</span><span class="si">}</span><span class="s2"> cannot be included in the composite primary &quot;</span>
<span class="s2">&quot;key.&quot;</span><span class="p">,</span>
<span class="n">hint</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">duplicates</span><span class="si">}</span><span class="s2"> and </span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> are the same fields.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E042&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_db_table_comment</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">databases</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">db_table_comment</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">cls</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span>
<span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_comments</span>
<span class="ow">or</span> <span class="s2">&quot;supports_comments&quot;</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">required_db_features</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Warning</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">connection</span><span class="o">.</span><span class="n">display_name</span><span class="si">}</span><span class="s2"> does not support comments on &quot;</span>
<span class="sa">f</span><span class="s2">&quot;tables (db_table_comment).&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.W046&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_swappable</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Check if the swapped model exists.&quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">swapped</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">apps</span><span class="o">.</span><span class="n">get_model</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">swapped</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; is not of the form &#39;app_label.app_name&#39;.&quot;</span>
<span class="o">%</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">swappable</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E001&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">LookupError</span><span class="p">:</span>
<span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">swapped</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; references &#39;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">&#39;, which has not been &quot;</span>
<span class="s2">&quot;installed, or is abstract.&quot;</span>
<span class="o">%</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">swappable</span><span class="p">,</span> <span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span><span class="p">),</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E002&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_model</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">proxy</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span> <span class="ow">or</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_many_to_many</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;Proxy model &#39;</span><span class="si">%s</span><span class="s2">&#39; contains model fields.&quot;</span> <span class="o">%</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E017&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_managers</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Perform all manager checks.&quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">manager</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">managers</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">manager</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_fields</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Perform all field checks.&quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">field</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">local_fields</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">for</span> <span class="n">field</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">local_many_to_many</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="n">from_model</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_m2m_through_same_relationship</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check if no relationship model is used by more than one m2m field.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">seen_intermediary_signatures</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">fields</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_many_to_many</span>
<span class="c1"># Skip when the target model wasn&#39;t found.</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">ModelBase</span><span class="p">))</span>
<span class="c1"># Skip when the relationship model wasn&#39;t found.</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">ModelBase</span><span class="p">))</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="n">signature</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">,</span>
<span class="bp">cls</span><span class="p">,</span>
<span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="p">,</span>
<span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">signature</span> <span class="ow">in</span> <span class="n">seen_intermediary_signatures</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The model has two identical many-to-many relations &quot;</span>
<span class="s2">&quot;through the intermediate model &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span>
<span class="o">%</span> <span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E003&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">seen_intermediary_signatures</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">signature</span><span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_id_field</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Check if `id` field is a primary key.&quot;&quot;&quot;</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">f</span> <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">local_fields</span> <span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;id&quot;</span> <span class="ow">and</span> <span class="n">f</span> <span class="o">!=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span>
<span class="p">]</span>
<span class="c1"># fields is empty or consists of the invalid &quot;id&quot; field</span>
<span class="k">if</span> <span class="n">fields</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">primary_key</span> <span class="ow">and</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;id&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;id&#39; can only be used as a field name if the field also &quot;</span>
<span class="s2">&quot;sets &#39;primary_key=True&#39;.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E004&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_field_name_clashes</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Forbid field shadowing in multi-table inheritance.&quot;&quot;&quot;</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">used_fields</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># name or attname -&gt; field</span>
<span class="c1"># Check that multi-inheritance doesn&#39;t cause field name shadowing.</span>
<span class="k">for</span> <span class="n">parent</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">all_parents</span><span class="p">:</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">:</span>
<span class="n">clash</span> <span class="o">=</span> <span class="n">used_fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="n">used_fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">clash</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The field &#39;</span><span class="si">%s</span><span class="s2">&#39; from parent model &quot;</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; clashes with the field &#39;</span><span class="si">%s</span><span class="s2">&#39; &quot;</span>
<span class="s2">&quot;from parent model &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">clash</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">clash</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E005&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">used_fields</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span>
<span class="n">used_fields</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span>
<span class="c1"># Check that fields defined in the model don&#39;t clash with fields from</span>
<span class="c1"># parents, including auto-generated fields like multi-table inheritance</span>
<span class="c1"># child accessors.</span>
<span class="k">for</span> <span class="n">parent</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">all_parents</span><span class="p">:</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_fields</span><span class="p">():</span>
<span class="k">if</span> <span class="n">f</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">used_fields</span><span class="p">:</span>
<span class="n">used_fields</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span>
<span class="c1"># Check that parent links in diamond-shaped MTI models don&#39;t clash.</span>
<span class="k">for</span> <span class="n">parent_link</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">parents</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">parent_link</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">clash</span> <span class="o">=</span> <span class="n">used_fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">parent_link</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">clash</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;The field &#39;</span><span class="si">{</span><span class="n">parent_link</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39; clashes with the field &quot;</span>
<span class="sa">f</span><span class="s2">&quot;&#39;</span><span class="si">{</span><span class="n">clash</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39; from model &#39;</span><span class="si">{</span><span class="n">clash</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="si">}</span><span class="s2">&#39;.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E006&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<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">local_fields</span><span class="p">:</span>
<span class="n">clash</span> <span class="o">=</span> <span class="n">used_fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="n">used_fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">None</span>
<span class="c1"># Note that we may detect clash between user-defined non-unique</span>
<span class="c1"># field &quot;id&quot; and automatically added unique field &quot;id&quot;, both</span>
<span class="c1"># defined at the same model. This special case is considered in</span>
<span class="c1"># _check_id_field and here we ignore it.</span>
<span class="n">id_conflict</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;id&quot;</span> <span class="ow">and</span> <span class="n">clash</span> <span class="ow">and</span> <span class="n">clash</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;id&quot;</span> <span class="ow">and</span> <span class="n">clash</span><span class="o">.</span><span class="n">model</span> <span class="o">==</span> <span class="bp">cls</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">clash</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">id_conflict</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The field &#39;</span><span class="si">%s</span><span class="s2">&#39; clashes with the field &#39;</span><span class="si">%s</span><span class="s2">&#39; &quot;</span>
<span class="s2">&quot;from model &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">clash</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">clash</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="n">f</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E006&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">used_fields</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span>
<span class="n">used_fields</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_column_name_clashes</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="c1"># Store a list of column names which have already been used by other</span>
<span class="c1"># fields.</span>
<span class="n">used_column_names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<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">local_fields</span><span class="p">:</span>
<span class="n">column_name</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">column</span>
<span class="c1"># Ensure the column name is not already in use.</span>
<span class="k">if</span> <span class="n">column_name</span> <span class="ow">and</span> <span class="n">column_name</span> <span class="ow">in</span> <span class="n">used_column_names</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;Field &#39;</span><span class="si">%s</span><span class="s2">&#39; has column name &#39;</span><span class="si">%s</span><span class="s2">&#39; that is used by &quot;</span>
<span class="s2">&quot;another field.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">column_name</span><span class="p">),</span>
<span class="n">hint</span><span class="o">=</span><span class="s2">&quot;Specify a &#39;db_column&#39; for the field.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E007&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">used_column_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">column_name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_model_name_db_lookup_clashes</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">model_name</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">if</span> <span class="n">model_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">model_name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The model name &#39;</span><span class="si">%s</span><span class="s2">&#39; cannot start or end with an underscore &quot;</span>
<span class="s2">&quot;as it collides with the query lookup syntax.&quot;</span> <span class="o">%</span> <span class="n">model_name</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E023&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">LOOKUP_SEP</span> <span class="ow">in</span> <span class="n">model_name</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The model name &#39;</span><span class="si">%s</span><span class="s2">&#39; cannot contain double underscores as &quot;</span>
<span class="s2">&quot;it collides with the query lookup syntax.&quot;</span> <span class="o">%</span> <span class="n">model_name</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E024&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_property_name_related_field_accessor_clashes</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">property_names</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">_property_names</span>
<span class="n">related_field_accessors</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">f</span><span class="o">.</span><span class="n">attname</span>
<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">_get_fields</span><span class="p">(</span><span class="n">reverse</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">is_relation</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">related_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">accessor</span> <span class="ow">in</span> <span class="n">related_field_accessors</span><span class="p">:</span>
<span class="k">if</span> <span class="n">accessor</span> <span class="ow">in</span> <span class="n">property_names</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The property &#39;</span><span class="si">%s</span><span class="s2">&#39; clashes with a related field &quot;</span>
<span class="s2">&quot;accessor.&quot;</span> <span class="o">%</span> <span class="n">accessor</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E025&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_single_primary_key</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="nb">sum</span><span class="p">(</span><span class="mi">1</span> <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">local_fields</span> <span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">primary_key</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The model cannot have more than one field with &quot;</span>
<span class="s2">&quot;&#39;primary_key=True&#39;.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E026&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_unique_together</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Check the value of &quot;unique_together&quot; option.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</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">unique_together</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;unique_together&#39; must be a list or tuple.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E010&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">elif</span> <span class="nb">any</span><span class="p">(</span>
<span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fields</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">))</span>
<span class="k">for</span> <span class="n">fields</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">unique_together</span>
<span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;All &#39;unique_together&#39; elements must be lists or tuples.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E011&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">fields</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">unique_together</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_check_local_fields</span><span class="p">(</span><span class="n">fields</span><span class="p">,</span> <span class="s2">&quot;unique_together&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_indexes</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">databases</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">cls</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="k">for</span> <span class="n">index</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">indexes</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">index</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">connection</span><span class="p">))</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_local_fields</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">fields</span><span class="p">,</span> <span class="n">option</span><span class="p">):</span>
<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>
<span class="c1"># In order to avoid hitting the relation tree prematurely, we use our</span>
<span class="c1"># own fields_map instead of using get_field()</span>
<span class="n">forward_fields_map</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">field</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">_get_fields</span><span class="p">(</span><span class="n">reverse</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">forward_fields_map</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">field</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;attname&quot;</span><span class="p">):</span>
<span class="n">forward_fields_map</span><span class="p">[</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">]</span> <span class="o">=</span> <span class="n">field</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">field</span> <span class="o">=</span> <span class="n">forward_fields_map</span><span class="p">[</span><span class="n">field_name</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; refers to the nonexistent field &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">option</span><span class="p">,</span>
<span class="n">field_name</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E012&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">ManyToManyRel</span><span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; refers to a ManyToManyField &#39;</span><span class="si">%s</span><span class="s2">&#39;, but &quot;</span>
<span class="s2">&quot;ManyToManyFields are not permitted in &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">option</span><span class="p">,</span>
<span class="n">field_name</span><span class="p">,</span>
<span class="n">option</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E013&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">models</span><span class="o">.</span><span class="n">CompositePrimaryKey</span><span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">option</span><span class="si">!r}</span><span class="s2"> refers to a CompositePrimaryKey &quot;</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2">, but CompositePrimaryKeys are not &quot;</span>
<span class="sa">f</span><span class="s2">&quot;permitted in </span><span class="si">{</span><span class="n">option</span><span class="si">!r}</span><span class="s2">.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E048&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="p">(</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="n">ForeignObjectRel</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">field</span> <span class="ow">not</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">local_concrete_fields</span>
<span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">from_fields</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">option</span><span class="si">!r}</span><span class="s2"> refers to a ForeignObject </span><span class="si">{</span><span class="n">field_name</span><span class="si">!r}</span><span class="s2"> with &quot;</span>
<span class="s2">&quot;multiple &#39;from_fields&#39;, which is not supported for that &quot;</span>
<span class="s2">&quot;option.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E049&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">field</span> <span class="ow">not</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">local_fields</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39; refers to field &#39;</span><span class="si">%s</span><span class="s2">&#39; which is not local to model &quot;</span>
<span class="s2">&quot;&#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">option</span><span class="p">,</span> <span class="n">field_name</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">object_name</span><span class="p">),</span>
<span class="n">hint</span><span class="o">=</span><span class="s2">&quot;This issue may be caused by multi-table inheritance.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E016&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_ordering</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check &quot;ordering&quot; option -- is it a list of strings and do all fields</span>
<span class="sd"> exist?</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">_ordering_clash</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;ordering&#39; and &#39;order_with_respect_to&#39; cannot be used together.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E021&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">]</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">order_with_respect_to</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">ordering</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</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">ordering</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;ordering&#39; must be a tuple or list (even if you want to order by &quot;</span>
<span class="s2">&quot;only one field).&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E014&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">fields</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">ordering</span>
<span class="c1"># Skip expressions and &#39;?&#39; fields.</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">f</span> <span class="o">!=</span> <span class="s2">&quot;?&quot;</span><span class="p">)</span>
<span class="c1"># Convert &quot;-field&quot; to &quot;field&quot;.</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">)</span>
<span class="c1"># Separate related fields and non-related fields.</span>
<span class="n">_fields</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">related_fields</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">LOOKUP_SEP</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
<span class="n">related_fields</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">_fields</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="n">fields</span> <span class="o">=</span> <span class="n">_fields</span>
<span class="c1"># Check related fields.</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">related_fields</span><span class="p">:</span>
<span class="n">_cls</span> <span class="o">=</span> <span class="bp">cls</span>
<span class="n">fld</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">field</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">LOOKUP_SEP</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># pk is an alias that won&#39;t be found by opts.get_field.</span>
<span class="k">if</span> <span class="n">part</span> <span class="o">==</span> <span class="s2">&quot;pk&quot;</span><span class="p">:</span>
<span class="n">fld</span> <span class="o">=</span> <span class="n">_cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">fld</span> <span class="o">=</span> <span class="n">_cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
<span class="k">if</span> <span class="n">fld</span><span class="o">.</span><span class="n">is_relation</span><span class="p">:</span>
<span class="n">_cls</span> <span class="o">=</span> <span class="n">fld</span><span class="o">.</span><span class="n">path_infos</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">to_opts</span><span class="o">.</span><span class="n">model</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">_cls</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">except</span> <span class="p">(</span><span class="n">FieldDoesNotExist</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
<span class="k">if</span> <span class="n">fld</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="p">(</span>
<span class="n">fld</span><span class="o">.</span><span class="n">get_transform</span><span class="p">(</span><span class="n">part</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">fld</span><span class="o">.</span><span class="n">get_lookup</span><span class="p">(</span><span class="n">part</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;ordering&#39; refers to the nonexistent field, &quot;</span>
<span class="s2">&quot;related field, or lookup &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="n">field</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E015&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="c1"># Skip ordering on pk. This is always a valid order_by field</span>
<span class="c1"># but is an alias and therefore won&#39;t be found by opts.get_field.</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">{</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span> <span class="k">if</span> <span class="n">f</span> <span class="o">!=</span> <span class="s2">&quot;pk&quot;</span><span class="p">}</span>
<span class="c1"># Check for invalid or nonexistent fields in ordering.</span>
<span class="n">invalid_fields</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># Any field name that is not present in field_names does not exist.</span>
<span class="c1"># Also, ordering by m2m fields is not allowed.</span>
<span class="n">opts</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">valid_fields</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span>
<span class="n">chain</span><span class="o">.</span><span class="n">from_iterable</span><span class="p">(</span>
<span class="p">(</span>
<span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">auto_created</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">f</span><span class="o">.</span><span class="n">concrete</span><span class="p">)</span>
<span class="k">else</span> <span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">related_query_name</span><span class="p">(),)</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">chain</span><span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">fields</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">related_objects</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">invalid_fields</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">fields</span> <span class="o">-</span> <span class="n">valid_fields</span><span class="p">)</span>
<span class="k">for</span> <span class="n">invalid_field</span> <span class="ow">in</span> <span class="n">invalid_fields</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;ordering&#39; refers to the nonexistent field, related &quot;</span>
<span class="s2">&quot;field, or lookup &#39;</span><span class="si">%s</span><span class="s2">&#39;.&quot;</span> <span class="o">%</span> <span class="n">invalid_field</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E015&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_long_column_names</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">databases</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check that any auto-generated column names are shorter than the limits</span>
<span class="sd"> for each database in which the model will be created.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">allowed_len</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">db_alias</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Find the minimum max allowed length among all specified db_aliases.</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="c1"># skip databases where the model won&#39;t be created</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">cls</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="n">max_name_length</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">max_name_length</span><span class="p">()</span>
<span class="k">if</span> <span class="n">max_name_length</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">truncates_names</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">allowed_len</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">allowed_len</span> <span class="o">=</span> <span class="n">max_name_length</span>
<span class="n">db_alias</span> <span class="o">=</span> <span class="n">db</span>
<span class="k">elif</span> <span class="n">max_name_length</span> <span class="o">&lt;</span> <span class="n">allowed_len</span><span class="p">:</span>
<span class="n">allowed_len</span> <span class="o">=</span> <span class="n">max_name_length</span>
<span class="n">db_alias</span> <span class="o">=</span> <span class="n">db</span>
<span class="k">if</span> <span class="n">allowed_len</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">errors</span>
<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">local_fields</span><span class="p">:</span>
<span class="c1"># Check if auto-generated name for the field is too long</span>
<span class="c1"># for the database.</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">f</span><span class="o">.</span><span class="n">db_column</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="p">(</span><span class="n">column_name</span> <span class="o">:=</span> <span class="n">f</span><span class="o">.</span><span class="n">column</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">column_name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">allowed_len</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s1">&#39;Autogenerated column name too long for field &quot;</span><span class="si">%s</span><span class="s1">&quot;. &#39;</span>
<span class="s1">&#39;Maximum length is &quot;</span><span class="si">%s</span><span class="s1">&quot; for database &quot;</span><span class="si">%s</span><span class="s1">&quot;.&#39;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">column_name</span><span class="p">,</span> <span class="n">allowed_len</span><span class="p">,</span> <span class="n">db_alias</span><span class="p">),</span>
<span class="n">hint</span><span class="o">=</span><span class="s2">&quot;Set the column name manually using &#39;db_column&#39;.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E018&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<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">local_many_to_many</span><span class="p">:</span>
<span class="c1"># Skip nonexistent models.</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">continue</span>
<span class="c1"># Check if auto-generated name for the M2M field is too long</span>
<span class="c1"># for the database.</span>
<span class="k">for</span> <span class="n">m2m</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">local_fields</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">m2m</span><span class="o">.</span><span class="n">db_column</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="p">(</span><span class="n">rel_name</span> <span class="o">:=</span> <span class="n">m2m</span><span class="o">.</span><span class="n">column</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">rel_name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">allowed_len</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;Autogenerated column name too long for M2M field &quot;</span>
<span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;. Maximum length is &quot;</span><span class="si">%s</span><span class="s1">&quot; for database &quot;</span><span class="si">%s</span><span class="s1">&quot;.&#39;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">rel_name</span><span class="p">,</span> <span class="n">allowed_len</span><span class="p">,</span> <span class="n">db_alias</span><span class="p">),</span>
<span class="n">hint</span><span class="o">=</span><span class="p">(</span>
<span class="s2">&quot;Use &#39;through&#39; to create a separate model for &quot;</span>
<span class="s2">&quot;M2M and then set column_name using &#39;db_column&#39;.&quot;</span>
<span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">cls</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;models.E019&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_expr_references</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">expr</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">Q</span><span class="p">):</span>
<span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">child</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">lookup</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">child</span>
<span class="k">yield</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">lookup</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">LOOKUP_SEP</span><span class="p">))</span>
<span class="k">yield from</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_expr_references</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">yield from</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_expr_references</span><span class="p">(</span><span class="n">child</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">F</span><span class="p">):</span>
<span class="k">yield</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">LOOKUP_SEP</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="s2">&quot;get_source_expressions&quot;</span><span class="p">):</span>
<span class="k">for</span> <span class="n">src_expr</span> <span class="ow">in</span> <span class="n">expr</span><span class="o">.</span><span class="n">get_source_expressions</span><span class="p">():</span>
<span class="k">yield from</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_expr_references</span><span class="p">(</span><span class="n">src_expr</span><span class="p">)</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_constraints</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">databases</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">cls</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="k">for</span> <span class="n">constraint</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">constraints</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">constraint</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">connection</span><span class="p">))</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="c1">############################################</span>
<span class="c1"># HELPER FUNCTIONS (CURRIED MODEL METHODS) #</span>
<span class="c1">############################################</span>
<span class="c1"># ORDERING METHODS #########################</span>
<span class="k">def</span><span class="w"> </span><span class="nf">method_set_order</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ordered_obj</span><span class="p">,</span> <span class="n">id_list</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">order_wrt</span> <span class="o">=</span> <span class="n">ordered_obj</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">order_with_respect_to</span>
<span class="n">filter_args</span> <span class="o">=</span> <span class="n">order_wrt</span><span class="o">.</span><span class="n">get_forward_related_filter</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">ordered_obj</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">using</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">filter_args</span><span class="p">)</span><span class="o">.</span><span class="n">bulk_update</span><span class="p">(</span>
<span class="p">[</span><span class="n">ordered_obj</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">pk</span><span class="p">,</span> <span class="n">_order</span><span class="o">=</span><span class="n">order</span><span class="p">)</span> <span class="k">for</span> <span class="n">order</span><span class="p">,</span> <span class="n">pk</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">id_list</span><span class="p">)],</span>
<span class="p">[</span><span class="s2">&quot;_order&quot;</span><span class="p">],</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">method_get_order</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ordered_obj</span><span class="p">):</span>
<span class="n">order_wrt</span> <span class="o">=</span> <span class="n">ordered_obj</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">order_with_respect_to</span>
<span class="n">filter_args</span> <span class="o">=</span> <span class="n">order_wrt</span><span class="o">.</span><span class="n">get_forward_related_filter</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">pk_name</span> <span class="o">=</span> <span class="n">ordered_obj</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">name</span>
<span class="k">return</span> <span class="n">ordered_obj</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="o">**</span><span class="n">filter_args</span><span class="p">)</span><span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="n">pk_name</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">make_foreign_order_accessors</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">related_model</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span>
<span class="n">related_model</span><span class="p">,</span>
<span class="s2">&quot;get_</span><span class="si">%s</span><span class="s2">_order&quot;</span> <span class="o">%</span> <span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
<span class="n">partialmethod</span><span class="p">(</span><span class="n">method_get_order</span><span class="p">,</span> <span class="n">model</span><span class="p">),</span>
<span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span>
<span class="n">related_model</span><span class="p">,</span>
<span class="s2">&quot;set_</span><span class="si">%s</span><span class="s2">_order&quot;</span> <span class="o">%</span> <span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
<span class="n">partialmethod</span><span class="p">(</span><span class="n">method_set_order</span><span class="p">,</span> <span class="n">model</span><span class="p">),</span>
<span class="p">)</span>
<span class="c1">########</span>
<span class="c1"># MISC #</span>
<span class="c1">########</span>
<span class="k">def</span><span class="w"> </span><span class="nf">model_unpickle</span><span class="p">(</span><span class="n">model_id</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Used to unpickle Model subclasses with deferred fields.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model_id</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="o">*</span><span class="n">model_id</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Backwards compat - the model was cached directly in earlier versions.</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">model_id</span>
<span class="k">return</span> <span class="n">model</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="n">model_unpickle</span><span class="o">.</span><span class="n">__safe_for_unpickle__</span> <span class="o">=</span> <span class="kc">True</span>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo of Evennia"/>
</a></p>
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
<h3>Doc Versions</h3>
<ul>
<li>
<a href="https://www.evennia.com/docs/latest/index.html">latest (main branch)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/5.x/index.html">v5.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/4.x/index.html">v4.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/3.x/index.html">v3.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/2.x/index.html">v2.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/1.x/index.html">v1.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/0.x/index.html">v0.9.5 branch (outdated)</a>
</li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">django.db.models.base</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>