<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang=""> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>django.db.models.fields.related — Django 1.8.19 documentation</title> <link rel="stylesheet" href="../../../../../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../../../../../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../../../../../', VERSION: '1.8.19', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../../../../../_static/jquery.js"></script> <script type="text/javascript" src="../../../../../_static/underscore.js"></script> <script type="text/javascript" src="../../../../../_static/doctools.js"></script> <link rel="index" title="Index" href="../../../../../genindex.html" /> <link rel="search" title="Search" href="../../../../../search.html" /> <link rel="top" title="Django 1.8.19 documentation" href="../../../../../contents.html" /> <link rel="up" title="django.db.models.fields" href="../fields.html" /> <script type="text/javascript" src="../../../../../templatebuiltins.js"></script> <script type="text/javascript"> (function($) { if (!django_template_builtins) { // templatebuiltins.js missing, do nothing. return; } $(document).ready(function() { // Hyperlink Django template tags and filters var base = "../../../../../ref/templates/builtins.html"; if (base == "#") { // Special case for builtins.html itself base = ""; } // Tags are keywords, class '.k' $("div.highlight\\-html\\+django span.k").each(function(i, elem) { var tagname = $(elem).text(); if ($.inArray(tagname, django_template_builtins.ttags) != -1) { var fragment = tagname.replace(/_/, '-'); $(elem).html("<a href='" + base + "#" + fragment + "'>" + tagname + "</a>"); } }); // Filters are functions, class '.nf' $("div.highlight\\-html\\+django span.nf").each(function(i, elem) { var filtername = $(elem).text(); if ($.inArray(filtername, django_template_builtins.tfilters) != -1) { var fragment = filtername.replace(/_/, '-'); $(elem).html("<a href='" + base + "#" + fragment + "'>" + filtername + "</a>"); } }); }); })(jQuery); </script> </head> <body role="document"> <div class="document"> <div id="custom-doc" class="yui-t6"> <div id="hd"> <h1><a href="../../../../../index.html">Django 1.8.19 documentation</a></h1> <div id="global-nav"> <a title="Home page" href="../../../../../index.html">Home</a> | <a title="Table of contents" href="../../../../../contents.html">Table of contents</a> | <a title="Global index" href="../../../../../genindex.html">Index</a> | <a title="Module index" href="../../../../../py-modindex.html">Modules</a> </div> <div class="nav"> <a href="../../../../index.html" title="Module code" accesskey="U">up</a></div> </div> <div id="bd"> <div id="yui-main"> <div class="yui-b"> <div class="yui-g" id="_modules-django-db-models-fields-related"> <h1>Source code for django.db.models.fields.related</h1><div class="highlight"><pre> <span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">unicode_literals</span> <span class="kn">import</span> <span class="nn">warnings</span> <span class="kn">from</span> <span class="nn">operator</span> <span class="k">import</span> <span class="n">attrgetter</span> <span class="kn">from</span> <span class="nn">django</span> <span class="k">import</span> <span class="n">forms</span> <span class="kn">from</span> <span class="nn">django.apps</span> <span class="k">import</span> <span class="n">apps</span> <span class="kn">from</span> <span class="nn">django.core</span> <span class="k">import</span> <span class="n">checks</span><span class="p">,</span> <span class="n">exceptions</span> <span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="k">import</span> <span class="n">FieldDoesNotExist</span> <span class="kn">from</span> <span class="nn">django.db</span> <span class="k">import</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="kn">from</span> <span class="nn">django.db.backends</span> <span class="k">import</span> <span class="n">utils</span> <span class="kn">from</span> <span class="nn">django.db.models</span> <span class="k">import</span> <span class="n">Q</span><span class="p">,</span> <span class="n">signals</span> <span class="kn">from</span> <span class="nn">django.db.models.deletion</span> <span class="k">import</span> <span class="n">CASCADE</span><span class="p">,</span> <span class="n">SET_DEFAULT</span><span class="p">,</span> <span class="n">SET_NULL</span> <span class="kn">from</span> <span class="nn">django.db.models.fields</span> <span class="k">import</span> <span class="p">(</span> <span class="n">BLANK_CHOICE_DASH</span><span class="p">,</span> <span class="n">AutoField</span><span class="p">,</span> <span class="n">Field</span><span class="p">,</span> <span class="n">IntegerField</span><span class="p">,</span> <span class="n">PositiveIntegerField</span><span class="p">,</span> <span class="n">PositiveSmallIntegerField</span><span class="p">,</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">django.db.models.lookups</span> <span class="k">import</span> <span class="n">IsNull</span> <span class="kn">from</span> <span class="nn">django.db.models.query</span> <span class="k">import</span> <span class="n">QuerySet</span> <span class="kn">from</span> <span class="nn">django.db.models.query_utils</span> <span class="k">import</span> <span class="n">PathInfo</span> <span class="kn">from</span> <span class="nn">django.utils</span> <span class="k">import</span> <span class="n">six</span> <span class="kn">from</span> <span class="nn">django.utils.deprecation</span> <span class="k">import</span> <span class="n">RemovedInDjango110Warning</span> <span class="kn">from</span> <span class="nn">django.utils.encoding</span> <span class="k">import</span> <span class="n">force_text</span><span class="p">,</span> <span class="n">smart_text</span> <span class="kn">from</span> <span class="nn">django.utils.functional</span> <span class="k">import</span> <span class="n">cached_property</span><span class="p">,</span> <span class="n">curry</span> <span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="k">import</span> <span class="n">ugettext_lazy</span> <span class="k">as</span> <span class="n">_</span> <span class="n">RECURSIVE_RELATIONSHIP_CONSTANT</span> <span class="o">=</span> <span class="s1">'self'</span> <span class="k">def</span> <span class="nf">add_lazy_relation</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">relation</span><span class="p">,</span> <span class="n">operation</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Adds a lookup on ``cls`` when a related field is defined using a string,</span> <span class="sd"> i.e.::</span> <span class="sd"> class MyModel(Model):</span> <span class="sd"> fk = ForeignKey("AnotherModel")</span> <span class="sd"> This string can be:</span> <span class="sd"> * RECURSIVE_RELATIONSHIP_CONSTANT (i.e. "self") to indicate a recursive</span> <span class="sd"> relation.</span> <span class="sd"> * The name of a model (i.e "AnotherModel") to indicate another model in</span> <span class="sd"> the same app.</span> <span class="sd"> * An app-label and model name (i.e. "someapp.AnotherModel") to indicate</span> <span class="sd"> another model in a different app.</span> <span class="sd"> If the other model hasn't yet been loaded -- almost a given if you're using</span> <span class="sd"> lazy relationships -- then the relation won't be set up until the</span> <span class="sd"> class_prepared signal fires at the end of model initialization.</span> <span class="sd"> operation is the work that must be performed once the relation can be resolved.</span> <span class="sd"> """</span> <span class="c1"># Check for recursive relations</span> <span class="k">if</span> <span class="n">relation</span> <span class="o">==</span> <span class="n">RECURSIVE_RELATIONSHIP_CONSTANT</span><span class="p">:</span> <span class="n">app_label</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">app_label</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">__name__</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Look for an "app.Model" relation</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="k">try</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="n">relation</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"."</span><span class="p">)</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="c1"># If we can't split, assume a model in current app</span> <span class="n">app_label</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">app_label</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">relation</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># it's actually a model class</span> <span class="n">app_label</span> <span class="o">=</span> <span class="n">relation</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">relation</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span> <span class="c1"># Try to look up the related model, and if it's already loaded resolve the</span> <span class="c1"># string right away. If get_registered_model raises a LookupError, it means</span> <span class="c1"># that the related model isn't loaded yet, so we need to pend the relation</span> <span class="c1"># until the class is prepared.</span> <span class="k">try</span><span class="p">:</span> <span class="n">model</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">apps</span><span class="o">.</span><span class="n">get_registered_model</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="k">except</span> <span class="ne">LookupError</span><span class="p">:</span> <span class="n">key</span> <span class="o">=</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="n">value</span> <span class="o">=</span> <span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">operation</span><span class="p">)</span> <span class="n">cls</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">_pending_lookups</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="n">value</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">operation</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span> <span class="k">def</span> <span class="nf">do_pending_lookups</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Handle any pending relations to the sending model. Sent from class_prepared.</span> <span class="sd"> """</span> <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">sender</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">sender</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span> <span class="k">for</span> <span class="n">cls</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">operation</span> <span class="ow">in</span> <span class="n">sender</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">_pending_lookups</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">[]):</span> <span class="n">operation</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">sender</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span> <span class="n">signals</span><span class="o">.</span><span class="n">class_prepared</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">do_pending_lookups</span><span class="p">)</span> <span class="k">class</span> <span class="nc">RelatedField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span> <span class="c1"># Field flags</span> <span class="n">one_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">one_to_one</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">many_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">many_to_one</span> <span class="o">=</span> <span class="kc">False</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">related_model</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Can't cache this property until all the models are loaded.</span> <span class="n">apps</span><span class="o">.</span><span class="n">check_models_ready</span><span class="p">()</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="k">def</span> <span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">errors</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</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="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_related_name_is_valid</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">self</span><span class="o">.</span><span class="n">_check_relation_model_exists</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">self</span><span class="o">.</span><span class="n">_check_referencing_to_swapped_model</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">self</span><span class="o">.</span><span class="n">_check_clashes</span><span class="p">())</span> <span class="k">return</span> <span class="n">errors</span> <span class="k">def</span> <span class="nf">_check_related_name_is_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="kn">import</span> <span class="nn">re</span> <span class="kn">import</span> <span class="nn">keyword</span> <span class="n">related_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">related_name</span><span class="p">:</span> <span class="k">return</span> <span class="p">[]</span> <span class="n">is_valid_id</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">keyword</span><span class="o">.</span><span class="n">iskeyword</span><span class="p">(</span><span class="n">related_name</span><span class="p">):</span> <span class="n">is_valid_id</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">related_name</span><span class="o">.</span><span class="n">isidentifier</span><span class="p">():</span> <span class="n">is_valid_id</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s1">r'^[a-zA-Z_][a-zA-Z0-9_]*\Z'</span><span class="p">,</span> <span class="n">related_name</span><span class="p">):</span> <span class="n">is_valid_id</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">is_valid_id</span> <span class="ow">or</span> <span class="n">related_name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'+'</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">"The name '</span><span class="si">%s</span><span class="s2">' is invalid related_name for field </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</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">name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="s2">"Related name must be a valid Python identifier or end with a '+'"</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E306'</span><span class="p">,</span> <span class="p">)</span> <span class="p">]</span> <span class="k">return</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">_check_relation_model_exists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">rel_is_missing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span> <span class="n">rel_is_string</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="n">model_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="k">if</span> <span class="n">rel_is_string</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span> <span class="k">if</span> <span class="n">rel_is_missing</span> <span class="ow">and</span> <span class="p">(</span><span class="n">rel_is_string</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">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="p">(</span><span class="s2">"Field defines a relation with model '</span><span class="si">%s</span><span class="s2">', which "</span> <span class="s2">"is either not installed, or is abstract."</span><span class="p">)</span> <span class="o">%</span> <span class="n">model_name</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E300'</span><span class="p">,</span> <span class="p">)</span> <span class="p">]</span> <span class="k">return</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">_check_referencing_to_swapped_model</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">model</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">rel</span><span class="o">.</span><span class="n">to</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">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="p">(</span><span class="s2">"Field defines a relation with the model '</span><span class="si">%s</span><span class="s2">', "</span> <span class="s2">"which has been swapped out."</span><span class="p">)</span> <span class="o">%</span> <span class="n">model</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="s2">"Update the relation to point at 'settings.</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E301'</span><span class="p">,</span> <span class="p">)</span> <span class="p">]</span> <span class="k">return</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">_check_clashes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">""" Check accessor and reverse query name clashes. """</span> <span class="kn">from</span> <span class="nn">django.db.models.base</span> <span class="k">import</span> <span class="n">ModelBase</span> <span class="n">errors</span> <span class="o">=</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">model</span><span class="o">.</span><span class="n">_meta</span> <span class="c1"># `f.rel.to` may be a string instead of a model. Skip if model name is</span> <span class="c1"># not resolved.</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">ModelBase</span><span class="p">):</span> <span class="k">return</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">rel</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">return</span> <span class="p">[]</span> <span class="c1"># Consider that we are checking field `Model.foreign` and the models</span> <span class="c1"># are:</span> <span class="c1">#</span> <span class="c1"># class Target(models.Model):</span> <span class="c1"># model = models.IntegerField()</span> <span class="c1"># model_set = models.IntegerField()</span> <span class="c1">#</span> <span class="c1"># class Model(models.Model):</span> <span class="c1"># foreign = models.ForeignKey(Target)</span> <span class="c1"># m2m = models.ManyToManyField(Target)</span> <span class="c1"># rel_opts.object_name == "Target"</span> <span class="n">rel_opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span> <span class="c1"># If the field doesn't install a backward relation on the target model</span> <span class="c1"># (so `is_hidden` returns True), then there are no clashes to check</span> <span class="c1"># and we can skip these fields.</span> <span class="n">rel_is_hidden</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">()</span> <span class="n">rel_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">()</span> <span class="c1"># i. e. "model_set"</span> <span class="n">rel_query_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_query_name</span><span class="p">()</span> <span class="c1"># i. e. "model"</span> <span class="n">field_name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</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">name</span><span class="p">)</span> <span class="c1"># i. e. "Model.field"</span> <span class="c1"># Check clashes between accessor or reverse query name of `field`</span> <span class="c1"># and any other field name -- i.e. accessor for Model.foreign is</span> <span class="c1"># model_set and it clashes with Target.model_set.</span> <span class="n">potential_clashes</span> <span class="o">=</span> <span class="n">rel_opts</span><span class="o">.</span><span class="n">fields</span> <span class="o">+</span> <span class="n">rel_opts</span><span class="o">.</span><span class="n">many_to_many</span> <span class="k">for</span> <span class="n">clash_field</span> <span class="ow">in</span> <span class="n">potential_clashes</span><span class="p">:</span> <span class="n">clash_name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">rel_opts</span><span class="o">.</span><span class="n">object_name</span><span class="p">,</span> <span class="n">clash_field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="c1"># i. e. "Target.model_set"</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">rel_is_hidden</span> <span class="ow">and</span> <span class="n">clash_field</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">rel_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">"Reverse accessor for '</span><span class="si">%s</span><span class="s2">' clashes with field name '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">field_name</span><span class="p">,</span> <span class="n">clash_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s2">"Rename field '</span><span class="si">%s</span><span class="s2">', or add/change a related_name "</span> <span class="s2">"argument to the definition for field '</span><span class="si">%s</span><span class="s2">'."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">clash_name</span><span class="p">,</span> <span class="n">field_name</span><span class="p">),</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E302'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">if</span> <span class="n">clash_field</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">rel_query_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">"Reverse query name for '</span><span class="si">%s</span><span class="s2">' clashes with field name '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">field_name</span><span class="p">,</span> <span class="n">clash_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s2">"Rename field '</span><span class="si">%s</span><span class="s2">', or add/change a related_name "</span> <span class="s2">"argument to the definition for field '</span><span class="si">%s</span><span class="s2">'."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">clash_name</span><span class="p">,</span> <span class="n">field_name</span><span class="p">),</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E303'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="c1"># Check clashes between accessors/reverse query names of `field` and</span> <span class="c1"># any other field accessor -- i. e. Model.foreign accessor clashes with</span> <span class="c1"># Model.m2m accessor.</span> <span class="n">potential_clashes</span> <span class="o">=</span> <span class="p">(</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">rel_opts</span><span class="o">.</span><span class="n">related_objects</span> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">field</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">)</span> <span class="k">for</span> <span class="n">clash_field</span> <span class="ow">in</span> <span class="n">potential_clashes</span><span class="p">:</span> <span class="n">clash_name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span> <span class="c1"># i. e. "Model.m2m"</span> <span class="n">clash_field</span><span class="o">.</span><span class="n">related_model</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">clash_field</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">rel_is_hidden</span> <span class="ow">and</span> <span class="n">clash_field</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">()</span> <span class="o">==</span> <span class="n">rel_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">"Reverse accessor for '</span><span class="si">%s</span><span class="s2">' clashes with reverse accessor for '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">field_name</span><span class="p">,</span> <span class="n">clash_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s2">"Add or change a related_name argument "</span> <span class="s2">"to the definition for '</span><span class="si">%s</span><span class="s2">' or '</span><span class="si">%s</span><span class="s2">'."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">field_name</span><span class="p">,</span> <span class="n">clash_name</span><span class="p">),</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E304'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">if</span> <span class="n">clash_field</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">()</span> <span class="o">==</span> <span class="n">rel_query_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">"Reverse query name for '</span><span class="si">%s</span><span class="s2">' clashes with reverse query name for '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">field_name</span><span class="p">,</span> <span class="n">clash_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s2">"Add or change a related_name argument "</span> <span class="s2">"to the definition for '</span><span class="si">%s</span><span class="s2">' or '</span><span class="si">%s</span><span class="s2">'."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">field_name</span><span class="p">,</span> <span class="n">clash_name</span><span class="p">),</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E305'</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="k">def</span> <span class="nf">db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span> <span class="sd">'''By default related field will not have a column</span> <span class="sd"> as it relates columns to another table'''</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">virtual_only</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="n">sup</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span> <span class="c1"># Store the opts for related_query_name()</span> <span class="bp">self</span><span class="o">.</span><span class="n">opts</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">_meta</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sup</span><span class="p">,</span> <span class="s1">'contribute_to_class'</span><span class="p">):</span> <span class="n">sup</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">virtual_only</span><span class="o">=</span><span class="n">virtual_only</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span><span class="p">:</span> <span class="n">related_name</span> <span class="o">=</span> <span class="n">force_text</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span> <span class="s1">'class'</span><span class="p">:</span> <span class="n">cls</span><span class="o">.</span><span class="n">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="s1">'app_label'</span><span class="p">:</span> <span class="n">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="p">}</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="o">=</span> <span class="n">related_name</span> <span class="n">other</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="ow">or</span> <span class="n">other</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">def</span> <span class="nf">resolve_related_class</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="o">=</span> <span class="n">model</span> <span class="n">field</span><span class="o">.</span><span class="n">do_related_class</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span> <span class="n">add_lazy_relation</span><span class="p">(</span><span class="n">cls</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="n">resolve_related_class</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_related_class</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_forward_related_filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Return the keyword arguments that when supplied to</span> <span class="sd"> self.model.object.filter(), would select all instances related through</span> <span class="sd"> this field to the remote obj. This is used to build the querysets</span> <span class="sd"> returned by related descriptors. obj is an instance of</span> <span class="sd"> self.related_field.model.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="p">{</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">__</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">rh_field</span><span class="o">.</span><span class="n">name</span><span class="p">):</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">rh_field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">rh_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_fields</span> <span class="p">}</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">swappable_setting</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Gets the setting that this is powered from for swapping, or None</span> <span class="sd"> if it's not swapped in / marked with swappable=False.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">swappable</span><span class="p">:</span> <span class="c1"># Work out string form of "to"</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="n">to_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="k">else</span><span class="p">:</span> <span class="n">to_string</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">rel</span><span class="o">.</span><span class="n">to</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="p">)</span> <span class="c1"># See if anything swapped/swappable matches</span> <span class="k">for</span> <span class="n">model</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">(</span><span class="n">include_swapped</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="k">if</span> <span class="n">model</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">if</span> <span class="n">model</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">to_string</span><span class="p">:</span> <span class="k">return</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">swappable</span> <span class="k">if</span> <span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">model</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">model</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="o">==</span> <span class="n">to_string</span> <span class="ow">and</span> <span class="n">model</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="k">return</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">swappable</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">set_attributes_from_rel</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">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span> <span class="o">+</span> <span class="s1">'_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose_name</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">verbose_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">set_field_name</span><span class="p">()</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">related</span><span class="p">(</span><span class="bp">self</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">"Usage of field.related has been deprecated. Use field.rel instead."</span><span class="p">,</span> <span class="n">RemovedInDjango110Warning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="k">def</span> <span class="nf">do_related_class</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="n">cls</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_attributes_from_rel</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">cls</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="bp">self</span><span class="o">.</span><span class="n">contribute_to_related_class</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_limit_choices_to</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""Returns 'limit_choices_to' for this model field.</span> <span class="sd"> If it is a callable, it will be invoked and the result will be</span> <span class="sd"> returned.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">limit_choices_to</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">limit_choices_to</span><span class="p">()</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">limit_choices_to</span> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="sd">"""Passes ``limit_choices_to`` to field being constructed.</span> <span class="sd"> Only passes it if there is a type that supports related fields.</span> <span class="sd"> This is a similar strategy used to pass the ``queryset`` to the field</span> <span class="sd"> being constructed.</span> <span class="sd"> """</span> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'get_related_field'</span><span class="p">):</span> <span class="c1"># If this is a callable, do not invoke it here. Just pass</span> <span class="c1"># it in the defaults for when the form class will later be</span> <span class="c1"># instantiated.</span> <span class="n">limit_choices_to</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">limit_choices_to</span> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">'limit_choices_to'</span><span class="p">:</span> <span class="n">limit_choices_to</span><span class="p">,</span> <span class="p">})</span> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span> <span class="k">def</span> <span class="nf">related_query_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># This method defines the name that can be used to identify this</span> <span class="c1"># related object in a table-spanning query. It uses the lower-cased</span> <span class="c1"># object_name by default, but this can be overridden with the</span> <span class="c1"># "related_name" option.</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_query_name</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">opts</span><span class="o">.</span><span class="n">model_name</span> <span class="k">class</span> <span class="nc">SingleRelatedObjectDescriptor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># This class provides the functionality that makes the related-object</span> <span class="c1"># managers available as attributes on a model class, for fields that have</span> <span class="c1"># a single "remote" value, on the class pointed to by a related field.</span> <span class="c1"># In the example "place.restaurant", the restaurant attribute is a</span> <span class="c1"># SingleRelatedObjectDescriptor instance.</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">related</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span> <span class="o">=</span> <span class="n">related</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span> <span class="o">=</span> <span class="n">related</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">()</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">RelatedObjectDoesNotExist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># The exception isn't created at initialization time for the sake of</span> <span class="c1"># consistency with `ReverseSingleRelatedObjectDescriptor`.</span> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'RelatedObjectDoesNotExist'</span><span class="p">),</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">),</span> <span class="p">{}</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">is_cached</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="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">hints</span><span class="p">):</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_default_manager</span> <span class="c1"># If the related manager indicates that it should be used for</span> <span class="c1"># related fields, respect that.</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">manager</span><span class="p">,</span> <span class="s1">'use_for_related_fields'</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_base_manager</span> <span class="k">return</span> <span class="n">manager</span><span class="o">.</span><span class="n">db_manager</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="o">.</span><span class="n">all</span><span class="p">()</span> <span class="k">def</span> <span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span> <span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">rel_obj_attr</span> <span class="o">=</span> <span class="n">attrgetter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="n">instance_attr</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">()</span> <span class="n">instances_dict</span> <span class="o">=</span> <span class="p">{</span><span class="n">instance_attr</span><span class="p">(</span><span class="n">inst</span><span class="p">):</span> <span class="n">inst</span> <span class="k">for</span> <span class="n">inst</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">}</span> <span class="n">query</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">instances</span><span class="p">}</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">query</span><span class="p">)</span> <span class="c1"># Since we're going to assign directly in the cache,</span> <span class="c1"># we must manage the reverse relation cache manually.</span> <span class="n">rel_obj_cache_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">()</span> <span class="k">for</span> <span class="n">rel_obj</span> <span class="ow">in</span> <span class="n">queryset</span><span class="p">:</span> <span class="n">instance</span> <span class="o">=</span> <span class="n">instances_dict</span><span class="p">[</span><span class="n">rel_obj_attr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">)]</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="n">rel_obj_cache_name</span><span class="p">,</span> <span class="n">instance</span><span class="p">)</span> <span class="k">return</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">rel_obj_attr</span><span class="p">,</span> <span class="n">instance_attr</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span> <span class="k">def</span> <span class="nf">__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="n">instance_type</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="k">try</span><span class="p">:</span> <span class="n">rel_obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="n">related_pk</span> <span class="o">=</span> <span class="n">instance</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">()</span> <span class="k">if</span> <span class="n">related_pk</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">rel_obj</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="n">params</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">lh_field</span><span class="p">,</span> <span class="n">rh_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">related_fields</span><span class="p">:</span> <span class="n">params</span><span class="p">[</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">rh_field</span><span class="o">.</span><span class="n">name</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">rh_field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">rel_obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instance</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">params</span><span class="p">)</span> <span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span> <span class="n">rel_obj</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">(),</span> <span class="n">instance</span><span class="p">)</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">,</span> <span class="n">rel_obj</span><span class="p">)</span> <span class="k">if</span> <span class="n">rel_obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">RelatedObjectDoesNotExist</span><span class="p">(</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> has no </span><span class="si">%s</span><span class="s2">."</span> <span class="o">%</span> <span class="p">(</span> <span class="n">instance</span><span class="o">.</span><span class="n">__class__</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">related</span><span class="o">.</span><span class="n">get_accessor_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="k">return</span> <span class="n">rel_obj</span> <span class="k">def</span> <span class="nf">__set__</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="n">value</span><span class="p">):</span> <span class="c1"># The similarity of the code below to the code in</span> <span class="c1"># ReverseSingleRelatedObjectDescriptor is annoying, but there's a bunch</span> <span class="c1"># of small differences that would make a common base class convoluted.</span> <span class="c1"># If null=True, we can assign null here, but otherwise the value needs</span> <span class="c1"># to be an instance of the related class.</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">null</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s1">'Cannot assign None: "</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">" does not allow null values.'</span> <span class="o">%</span> <span class="p">(</span> <span class="n">instance</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">related</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">(),</span> <span class="p">)</span> <span class="p">)</span> <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</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="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s1">'Cannot assign "</span><span class="si">%r</span><span class="s1">": "</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">" must be a "</span><span class="si">%s</span><span class="s1">" instance.'</span> <span class="o">%</span> <span class="p">(</span> <span class="n">value</span><span class="p">,</span> <span class="n">instance</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">related</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</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="p">)</span> <span class="p">)</span> <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">if</span> <span class="n">instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">value</span><span class="p">)</span> <span class="k">elif</span> <span class="n">value</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">value</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">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">instance</span><span class="p">)</span> <span class="k">elif</span> <span class="n">value</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</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_relation</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">instance</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Cannot assign "</span><span class="si">%r</span><span class="s1">": the current database router prevents this relation.'</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span> <span class="n">related_pk</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="n">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="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">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="c1"># Set the value of the related field to the value of the related object's related field</span> <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">field</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">local_related_fields</span><span class="p">):</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">value</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">related_pk</span><span class="p">[</span><span class="n">index</span><span class="p">])</span> <span class="c1"># Since we already know what the related object is, seed the related</span> <span class="c1"># object caches now, too. This avoids another db hit if you get the</span> <span class="c1"># object you just set.</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="nb">setattr</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="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">(),</span> <span class="n">instance</span><span class="p">)</span> <span class="k">class</span> <span class="nc">ReverseSingleRelatedObjectDescriptor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># This class provides the functionality that makes the related-object</span> <span class="c1"># managers available as attributes on a model class, for fields that have</span> <span class="c1"># a single "remote" value, on the class that defines the related field.</span> <span class="c1"># In the example "choice.poll", the poll attribute is a</span> <span class="c1"># ReverseSingleRelatedObjectDescriptor instance.</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field_with_rel</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="n">field_with_rel</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">()</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">RelatedObjectDoesNotExist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># The exception can't be created at initialization time since the</span> <span class="c1"># related model might not be resolved yet; `rel.to` might still be</span> <span class="c1"># a string model reference.</span> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span> <span class="nb">str</span><span class="p">(</span><span class="s1">'RelatedObjectDoesNotExist'</span><span class="p">),</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">),</span> <span class="p">{}</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">is_cached</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="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">hints</span><span class="p">):</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_default_manager</span> <span class="c1"># If the related manager indicates that it should be used for</span> <span class="c1"># related fields, respect that.</span> <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">manager</span><span class="p">,</span> <span class="s1">'use_for_related_fields'</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_base_manager</span> <span class="k">return</span> <span class="n">manager</span><span class="o">.</span><span class="n">db_manager</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="o">.</span><span class="n">all</span><span class="p">()</span> <span class="k">def</span> <span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span> <span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">rel_obj_attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_foreign_related_value</span> <span class="n">instance_attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_local_related_value</span> <span class="n">instances_dict</span> <span class="o">=</span> <span class="p">{</span><span class="n">instance_attr</span><span class="p">(</span><span class="n">inst</span><span class="p">):</span> <span class="n">inst</span> <span class="k">for</span> <span class="n">inst</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">}</span> <span class="n">related_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># FIXME: This will need to be revisited when we introduce support for</span> <span class="c1"># composite fields. In the meantime we take this practical approach to</span> <span class="c1"># solve a regression on 1.6 when the reverse manager in hidden</span> <span class="c1"># (related_name ends with a '+'). Refs #21410.</span> <span class="c1"># The check for len(...) == 1 is a special case that allows the query</span> <span class="c1"># to be join-less and smaller. Refs #21760.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">()</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">query</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="n">related_field</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="nb">set</span><span class="p">(</span><span class="n">instance_attr</span><span class="p">(</span><span class="n">inst</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">inst</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">)}</span> <span class="k">else</span><span class="p">:</span> <span class="n">query</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="bp">self</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="n">instances</span><span class="p">}</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">query</span><span class="p">)</span> <span class="c1"># Since we're going to assign directly in the cache,</span> <span class="c1"># we must manage the reverse relation cache manually.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">multiple</span><span class="p">:</span> <span class="n">rel_obj_cache_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">()</span> <span class="k">for</span> <span class="n">rel_obj</span> <span class="ow">in</span> <span class="n">queryset</span><span class="p">:</span> <span class="n">instance</span> <span class="o">=</span> <span class="n">instances_dict</span><span class="p">[</span><span class="n">rel_obj_attr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">)]</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="n">rel_obj_cache_name</span><span class="p">,</span> <span class="n">instance</span><span class="p">)</span> <span class="k">return</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">rel_obj_attr</span><span class="p">,</span> <span class="n">instance_attr</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span> <span class="k">def</span> <span class="nf">__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="n">instance_type</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="k">try</span><span class="p">:</span> <span class="n">rel_obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_local_related_value</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span> <span class="k">if</span> <span class="kc">None</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span> <span class="n">rel_obj</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span> <span class="n">rh_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">instance</span><span class="p">,</span> <span class="n">lh_field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="k">for</span> <span class="n">lh_field</span><span class="p">,</span> <span class="n">rh_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">related_fields</span><span class="p">}</span> <span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instance</span><span class="p">)</span> <span class="n">extra_filter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_extra_descriptor_filter</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">extra_filter</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span> <span class="n">params</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra_filter</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">filter</span><span class="p">(</span><span class="o">**</span><span class="n">params</span><span class="p">)</span> <span class="k">else</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">filter</span><span class="p">(</span><span class="n">extra_filter</span><span class="p">,</span> <span class="o">**</span><span class="n">params</span><span class="p">)</span> <span class="c1"># Assuming the database enforces foreign keys, this won't fail.</span> <span class="n">rel_obj</span> <span class="o">=</span> <span class="n">qs</span><span class="o">.</span><span class="n">get</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">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">multiple</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">(),</span> <span class="n">instance</span><span class="p">)</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">,</span> <span class="n">rel_obj</span><span class="p">)</span> <span class="k">if</span> <span class="n">rel_obj</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">null</span><span class="p">:</span> <span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">RelatedObjectDoesNotExist</span><span class="p">(</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> has no </span><span class="si">%s</span><span class="s2">."</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">model</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">field</span><span class="o">.</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="k">return</span> <span class="n">rel_obj</span> <span class="k">def</span> <span class="nf">__set__</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="n">value</span><span class="p">):</span> <span class="c1"># If null=True, we can assign null here, but otherwise the value needs</span> <span class="c1"># to be an instance of the related class.</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">null</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s1">'Cannot assign None: "</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">" does not allow null values.'</span> <span class="o">%</span> <span class="p">(</span><span class="n">instance</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">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="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</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="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s1">'Cannot assign "</span><span class="si">%r</span><span class="s1">": "</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">" must be a "</span><span class="si">%s</span><span class="s1">" instance.'</span> <span class="o">%</span> <span class="p">(</span> <span class="n">value</span><span class="p">,</span> <span class="n">instance</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">field</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">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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="p">)</span> <span class="p">)</span> <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">if</span> <span class="n">instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">value</span><span class="p">)</span> <span class="k">elif</span> <span class="n">value</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">value</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">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">instance</span><span class="p">)</span> <span class="k">elif</span> <span class="n">value</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</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_relation</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">instance</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Cannot assign "</span><span class="si">%r</span><span class="s1">": the current database router prevents this relation.'</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span> <span class="c1"># If we're setting the value of a OneToOneField to None, we need to clear</span> <span class="c1"># out the cache on any old related object. Otherwise, deleting the</span> <span class="c1"># previously-related object will also cause this object to be deleted,</span> <span class="c1"># which is wrong.</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># Look up the previously-related object, which may still be available</span> <span class="c1"># since we've not yet cleared out the related field.</span> <span class="c1"># Use the cache directly, instead of the accessor; if we haven't</span> <span class="c1"># populated the cache, then we don't care - we're only accessing</span> <span class="c1"># the object to invalidate the accessor cache, so there's no</span> <span class="c1"># need to populate the cache just to expire it again.</span> <span class="n">related</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="c1"># If we've got an old related object, we need to clear out its</span> <span class="c1"># cache. This cache also might not exist if the related object</span> <span class="c1"># hasn't been accessed yet.</span> <span class="k">if</span> <span class="n">related</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="n">related</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">(),</span> <span class="kc">None</span><span class="p">)</span> <span class="k">for</span> <span class="n">lh_field</span><span class="p">,</span> <span class="n">rh_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">related_fields</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">lh_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="c1"># Set the values of the related field.</span> <span class="k">else</span><span class="p">:</span> <span class="k">for</span> <span class="n">lh_field</span><span class="p">,</span> <span class="n">rh_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">related_fields</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">lh_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">value</span><span class="p">,</span> <span class="n">rh_field</span><span class="o">.</span><span class="n">attname</span><span class="p">))</span> <span class="c1"># Since we already know what the related object is, seed the related</span> <span class="c1"># object caches now, too. This avoids another db hit if you get the</span> <span class="c1"># object you just set.</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache_name</span><span class="p">,</span> <span class="n">value</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="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">multiple</span><span class="p">:</span> <span class="nb">setattr</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="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">(),</span> <span class="n">instance</span><span class="p">)</span> <span class="k">def</span> <span class="nf">create_foreign_related_manager</span><span class="p">(</span><span class="n">superclass</span><span class="p">,</span> <span class="n">rel_field</span><span class="p">,</span> <span class="n">rel_model</span><span class="p">):</span> <span class="k">class</span> <span class="nc">RelatedManager</span><span class="p">(</span><span class="n">superclass</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</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="nb">super</span><span class="p">(</span><span class="n">RelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="n">instance</span> <span class="bp">self</span><span class="o">.</span><span class="n">core_filters</span> <span class="o">=</span> <span class="p">{</span><span class="n">rel_field</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">instance</span><span class="p">}</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">rel_model</span> <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="c1"># We use **kwargs rather than a kwarg argument to enforce the</span> <span class="c1"># `manager='manager_name'` syntax.</span> <span class="n">manager</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'manager'</span><span class="p">))</span> <span class="n">manager_class</span> <span class="o">=</span> <span class="n">create_foreign_related_manager</span><span class="p">(</span><span class="n">manager</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">rel_field</span><span class="p">,</span> <span class="n">rel_model</span><span class="p">)</span> <span class="k">return</span> <span class="n">manager_class</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">do_not_call_in_templates</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span><span class="p">[</span><span class="n">rel_field</span><span class="o">.</span><span class="n">related_query_name</span><span class="p">()]</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span> <span class="n">db</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span> <span class="ow">or</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">empty_strings_as_null</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="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">interprets_empty_strings_as_nulls</span> <span class="n">qs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span> <span class="n">qs</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</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">using</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_db</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">filter</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">core_filters</span><span class="p">)</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">:</span> <span class="n">val</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">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="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="p">(</span><span class="n">val</span> <span class="o">==</span> <span class="s1">''</span> <span class="ow">and</span> <span class="n">empty_strings_as_null</span><span class="p">):</span> <span class="k">return</span> <span class="n">qs</span><span class="o">.</span><span class="n">none</span><span class="p">()</span> <span class="n">qs</span><span class="o">.</span><span class="n">_known_related_objects</span> <span class="o">=</span> <span class="p">{</span><span class="n">rel_field</span><span class="p">:</span> <span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">pk</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">}}</span> <span class="k">return</span> <span class="n">qs</span> <span class="k">def</span> <span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span> <span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">queryset</span><span class="o">.</span><span class="n">_db</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="p">)</span> <span class="n">rel_obj_attr</span> <span class="o">=</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">get_local_related_value</span> <span class="n">instance_attr</span> <span class="o">=</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">get_foreign_related_value</span> <span class="n">instances_dict</span> <span class="o">=</span> <span class="p">{</span><span class="n">instance_attr</span><span class="p">(</span><span class="n">inst</span><span class="p">):</span> <span class="n">inst</span> <span class="k">for</span> <span class="n">inst</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">}</span> <span class="n">query</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">instances</span><span class="p">}</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">query</span><span class="p">)</span> <span class="c1"># Since we just bypassed this class' get_queryset(), we must manage</span> <span class="c1"># the reverse relation manually.</span> <span class="k">for</span> <span class="n">rel_obj</span> <span class="ow">in</span> <span class="n">queryset</span><span class="p">:</span> <span class="n">instance</span> <span class="o">=</span> <span class="n">instances_dict</span><span class="p">[</span><span class="n">rel_obj_attr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">)]</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">instance</span><span class="p">)</span> <span class="n">cache_name</span> <span class="o">=</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">related_query_name</span><span class="p">()</span> <span class="k">return</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">rel_obj_attr</span><span class="p">,</span> <span class="n">instance_attr</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="n">cache_name</span> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">):</span> <span class="n">objs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">objs</span><span class="p">)</span> <span class="n">db</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="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">with</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">db</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">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</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">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"'</span><span class="si">%s</span><span class="s2">' instance expected, got </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</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">obj</span><span class="p">))</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">rel_field</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">instance</span><span class="p">)</span> <span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">()</span> <span class="n">add</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="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">rel_field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="n">db</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="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">))</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="n">create</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="nf">get_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">rel_field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="n">db</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="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">))</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="n">get_or_create</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="nf">update_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">rel_field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="n">db</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="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">))</span><span class="o">.</span><span class="n">update_or_create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="n">update_or_create</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># remove() and clear() are only provided if the ForeignKey can have a value of null.</span> <span class="k">if</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">null</span><span class="p">:</span> <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</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="n">objs</span><span class="p">:</span> <span class="k">return</span> <span class="n">bulk</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="s1">'bulk'</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span> <span class="n">val</span> <span class="o">=</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">get_foreign_related_value</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">old_ids</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span> <span class="c1"># Is obj actually part of this descriptor set?</span> <span class="k">if</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">get_local_related_value</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="o">==</span> <span class="n">val</span><span class="p">:</span> <span class="n">old_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2"> is not related to </span><span class="si">%r</span><span class="s2">."</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">_clear</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">pk__in</span><span class="o">=</span><span class="n">old_ids</span><span class="p">),</span> <span class="n">bulk</span><span class="p">)</span> <span class="n">remove</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="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">bulk</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="s1">'bulk'</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_clear</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bulk</span><span class="p">)</span> <span class="n">clear</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="nf">_clear</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">bulk</span><span class="p">):</span> <span class="n">db</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="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">db</span><span class="p">)</span> <span class="k">if</span> <span class="n">bulk</span><span class="p">:</span> <span class="c1"># `QuerySet.update()` is intrinsically atomic.</span> <span class="n">queryset</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">rel_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">else</span><span class="p">:</span> <span class="k">with</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">db</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">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">queryset</span><span class="p">:</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">rel_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="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">update_fields</span><span class="o">=</span><span class="p">[</span><span class="n">rel_field</span><span class="o">.</span><span class="n">name</span><span class="p">])</span> <span class="n">_clear</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">return</span> <span class="n">RelatedManager</span> <span class="k">class</span> <span class="nc">ForeignRelatedObjectsDescriptor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># This class provides the functionality that makes the related-object</span> <span class="c1"># managers available as attributes on a model class, for fields that have</span> <span class="c1"># multiple "remote" values and have a ForeignKey pointed at them by</span> <span class="c1"># some other model. In the example "poll.choice_set", the choice_set</span> <span class="c1"># attribute is a ForeignRelatedObjectsDescriptor instance.</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">related</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span> <span class="o">=</span> <span class="n">related</span> <span class="c1"># RelatedObject instance</span> <span class="k">def</span> <span class="nf">__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="n">instance_type</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_manager_cls</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__set__</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="n">value</span><span class="p">):</span> <span class="c1"># Force evaluation of `value` in case it's a queryset whose</span> <span class="c1"># value could be affected by `manager.clear()`. Refs #19816.</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__get__</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span> <span class="n">db</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="n">manager</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">manager</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">with</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">db</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="c1"># If the foreign key can support nulls, then completely clear the related set.</span> <span class="c1"># Otherwise, just move the named objects into the set.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">null</span><span class="p">:</span> <span class="n">manager</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span> <span class="n">manager</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="o">*</span><span class="n">value</span><span class="p">)</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">related_manager_cls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Dynamically create a class that subclasses the related model's default</span> <span class="c1"># manager.</span> <span class="k">return</span> <span class="n">create_foreign_related_manager</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="p">,</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">create_many_related_manager</span><span class="p">(</span><span class="n">superclass</span><span class="p">,</span> <span class="n">rel</span><span class="p">):</span> <span class="sd">"""Creates a manager that subclasses 'superclass' (which is a Manager)</span> <span class="sd"> and adds behavior for many-to-many related objects."""</span> <span class="k">class</span> <span class="nc">ManyRelatedManager</span><span class="p">(</span><span class="n">superclass</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">query_field_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">symmetrical</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">source_field_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">target_field_name</span><span class="o">=</span><span class="kc">None</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">through</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">prefetch_cache_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span> <span class="bp">self</span><span class="o">.</span><span class="n">query_field_name</span> <span class="o">=</span> <span class="n">query_field_name</span> <span class="n">source_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">get_field</span><span class="p">(</span><span class="n">source_field_name</span><span class="p">)</span> <span class="n">source_related_fields</span> <span class="o">=</span> <span class="n">source_field</span><span class="o">.</span><span class="n">related_fields</span> <span class="bp">self</span><span class="o">.</span><span class="n">core_filters</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">lh_field</span><span class="p">,</span> <span class="n">rh_field</span> <span class="ow">in</span> <span class="n">source_related_fields</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">core_filters</span><span class="p">[</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">query_field_name</span><span class="p">,</span> <span class="n">rh_field</span><span class="o">.</span><span class="n">name</span><span class="p">)]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">rh_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">instance</span> <span class="o">=</span> <span class="n">instance</span> <span class="bp">self</span><span class="o">.</span><span class="n">symmetrical</span> <span class="o">=</span> <span class="n">symmetrical</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_field</span> <span class="o">=</span> <span class="n">source_field</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_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">get_field</span><span class="p">(</span><span class="n">target_field_name</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span> <span class="o">=</span> <span class="n">source_field_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field_name</span> <span class="o">=</span> <span class="n">target_field_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">reverse</span> <span class="o">=</span> <span class="n">reverse</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</span> <span class="o">=</span> <span class="n">through</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefetch_cache_name</span> <span class="o">=</span> <span class="n">prefetch_cache_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_val</span> <span class="o">=</span> <span class="n">source_field</span><span class="o">.</span><span class="n">get_foreign_related_value</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span> <span class="k">if</span> <span class="kc">None</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_val</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'"</span><span class="si">%r</span><span class="s1">" needs to have a value for field "</span><span class="si">%s</span><span class="s1">" before '</span> <span class="s1">'this many-to-many relationship can be used.'</span> <span class="o">%</span> <span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">source_field_name</span><span class="p">))</span> <span class="c1"># Even if this relation is not to pk, we require still pk value.</span> <span class="c1"># The wish is that the instance has been already saved to DB,</span> <span class="c1"># although having a pk value isn't a guarantee of that.</span> <span class="k">if</span> <span class="n">instance</span><span class="o">.</span><span class="n">pk</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"</span><span class="si">%r</span><span class="s2"> instance needs to have a primary key value before "</span> <span class="s2">"a many-to-many relationship can be used."</span> <span class="o">%</span> <span class="n">instance</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="c1"># We use **kwargs rather than a kwarg argument to enforce the</span> <span class="c1"># `manager='manager_name'` syntax.</span> <span class="n">manager</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'manager'</span><span class="p">))</span> <span class="n">manager_class</span> <span class="o">=</span> <span class="n">create_many_related_manager</span><span class="p">(</span><span class="n">manager</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">rel</span><span class="p">)</span> <span class="k">return</span> <span class="n">manager_class</span><span class="p">(</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">query_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">query_field_name</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="n">symmetrical</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">symmetrical</span><span class="p">,</span> <span class="n">source_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">,</span> <span class="n">target_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">target_field_name</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reverse</span><span class="p">,</span> <span class="n">through</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">prefetch_cache_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">prefetch_cache_name</span><span class="p">,</span> <span class="p">)</span> <span class="n">do_not_call_in_templates</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">_build_remove_filters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">removed_vals</span><span class="p">):</span> <span class="n">filters</span> <span class="o">=</span> <span class="n">Q</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">source_field_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_val</span><span class="p">})</span> <span class="c1"># No need to add a subquery condition if removed_vals is a QuerySet without</span> <span class="c1"># filters.</span> <span class="n">removed_vals_filters</span> <span class="o">=</span> <span class="p">(</span><span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">removed_vals</span><span class="p">,</span> <span class="n">QuerySet</span><span class="p">)</span> <span class="ow">or</span> <span class="n">removed_vals</span><span class="o">.</span><span class="n">_has_filters</span><span class="p">())</span> <span class="k">if</span> <span class="n">removed_vals_filters</span><span class="p">:</span> <span class="n">filters</span> <span class="o">&=</span> <span class="n">Q</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field_name</span><span class="p">:</span> <span class="n">removed_vals</span><span class="p">})</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">symmetrical</span><span class="p">:</span> <span class="n">symmetrical_filters</span> <span class="o">=</span> <span class="n">Q</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">target_field_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_val</span><span class="p">})</span> <span class="k">if</span> <span class="n">removed_vals_filters</span><span class="p">:</span> <span class="n">symmetrical_filters</span> <span class="o">&=</span> <span class="n">Q</span><span class="p">(</span> <span class="o">**</span><span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">:</span> <span class="n">removed_vals</span><span class="p">})</span> <span class="n">filters</span> <span class="o">|=</span> <span class="n">symmetrical_filters</span> <span class="k">return</span> <span class="n">filters</span> <span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">prefetch_cache_name</span><span class="p">]</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span> <span class="n">qs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span> <span class="n">qs</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</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">using</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="p">)</span> <span class="k">return</span> <span class="n">qs</span><span class="o">.</span><span class="n">_next_is_sticky</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">core_filters</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span> <span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">queryset</span><span class="o">.</span><span class="n">_db</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="p">)</span> <span class="n">query</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">query_field_name</span><span class="p">:</span> <span class="n">instances</span><span class="p">}</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">_next_is_sticky</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">query</span><span class="p">)</span> <span class="c1"># M2M: need to annotate the query in order to get the primary model</span> <span class="c1"># that the secondary model was actually related to. We know that</span> <span class="c1"># there will already be a join on the join table, so we can just add</span> <span class="c1"># the select.</span> <span class="c1"># For non-autocreated 'through' models, can't assume we are</span> <span class="c1"># dealing with PK values.</span> <span class="n">fk</span> <span class="o">=</span> <span class="bp">self</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">get_field</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">)</span> <span class="n">join_table</span> <span class="o">=</span> <span class="bp">self</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">db_table</span> <span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">queryset</span><span class="o">.</span><span class="n">db</span><span class="p">]</span> <span class="n">qn</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">quote_name</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">extra</span><span class="p">(</span><span class="n">select</span><span class="o">=</span><span class="p">{</span> <span class="s1">'_prefetch_related_val_</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">:</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">qn</span><span class="p">(</span><span class="n">join_table</span><span class="p">),</span> <span class="n">qn</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">column</span><span class="p">))</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fk</span><span class="o">.</span><span class="n">local_related_fields</span><span class="p">})</span> <span class="k">return</span> <span class="p">(</span> <span class="n">queryset</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">result</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">(</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">'_prefetch_related_val_</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fk</span><span class="o">.</span><span class="n">local_related_fields</span> <span class="p">),</span> <span class="k">lambda</span> <span class="n">inst</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">(</span> <span class="n">f</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">inst</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">connection</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fk</span><span class="o">.</span><span class="n">foreign_related_fields</span> <span class="p">),</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefetch_cache_name</span><span class="p">,</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">rel</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">auto_created</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">through</span><span class="o">.</span><span class="n">_meta</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span> <span class="s2">"Cannot use add() on a ManyToManyField which specifies an "</span> <span class="s2">"intermediary model. Use </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">'s Manager instead."</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="p">)</span> <span class="p">)</span> <span class="n">db</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="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">with</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">db</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="bp">self</span><span class="o">.</span><span class="n">_add_items</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field_name</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">)</span> <span class="c1"># If this is a symmetrical m2m relation to self, add the mirror entry in the m2m table</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">symmetrical</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_items</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target_field_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">)</span> <span class="n">add</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="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">rel</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">auto_created</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">through</span><span class="o">.</span><span class="n">_meta</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span> <span class="s2">"Cannot use remove() on a ManyToManyField which specifies "</span> <span class="s2">"an intermediary model. Use </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">'s Manager instead."</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="p">)</span> <span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_remove_items</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field_name</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">)</span> <span class="n">remove</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="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">db</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="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">with</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">db</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="n">signals</span><span class="o">.</span><span class="n">m2m_changed</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">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"pre_clear"</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reverse</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">pk_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="n">db</span><span class="p">)</span> <span class="n">filters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_remove_filters</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">db</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</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="n">db</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">filters</span><span class="p">)</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span> <span class="n">signals</span><span class="o">.</span><span class="n">m2m_changed</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">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"post_clear"</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reverse</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">pk_set</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="n">db</span><span class="p">)</span> <span class="n">clear</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="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="c1"># This check needs to be done here, since we can't later remove this</span> <span class="c1"># from the method lookup table, as we do with add and remove.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</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">auto_created</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">through</span><span class="o">.</span><span class="n">_meta</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span> <span class="s2">"Cannot use create() on a ManyToManyField which specifies "</span> <span class="s2">"an intermediary model. Use </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">'s Manager instead."</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="p">)</span> <span class="p">)</span> <span class="n">db</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="n">instance</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">new_obj</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">))</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">new_obj</span><span class="p">)</span> <span class="k">return</span> <span class="n">new_obj</span> <span class="n">create</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="nf">get_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">db</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="n">instance</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">obj</span><span class="p">,</span> <span class="n">created</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">))</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="c1"># We only need to add() if created because if we got an object back</span> <span class="c1"># from get() then the relationship already exists.</span> <span class="k">if</span> <span class="n">created</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">created</span> <span class="n">get_or_create</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="nf">update_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">db</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="n">instance</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">obj</span><span class="p">,</span> <span class="n">created</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">))</span><span class="o">.</span><span class="n">update_or_create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="c1"># We only need to add() if created because if we got an object back</span> <span class="c1"># from get() then the relationship already exists.</span> <span class="k">if</span> <span class="n">created</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">created</span> <span class="n">update_or_create</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="nf">_add_items</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">source_field_name</span><span class="p">,</span> <span class="n">target_field_name</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">):</span> <span class="c1"># source_field_name: the PK fieldname in join table for the source object</span> <span class="c1"># target_field_name: the PK fieldname in join table for the target object</span> <span class="c1"># *objs - objects to add. Either object instances, or primary keys of object instances.</span> <span class="c1"># If there aren't any objects, there is nothing to do.</span> <span class="kn">from</span> <span class="nn">django.db.models</span> <span class="k">import</span> <span class="n">Model</span> <span class="k">if</span> <span class="n">objs</span><span class="p">:</span> <span class="n">new_ids</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</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_relation</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s1">'Cannot add "</span><span class="si">%r</span><span class="s1">": instance is on database "</span><span class="si">%s</span><span class="s1">", value is on database "</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">db</span><span class="p">,</span> <span class="n">obj</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="p">)</span> <span class="n">fk_val</span> <span class="o">=</span> <span class="bp">self</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">get_field</span><span class="p">(</span> <span class="n">target_field_name</span><span class="p">)</span><span class="o">.</span><span class="n">get_foreign_related_value</span><span class="p">(</span><span class="n">obj</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">fk_val</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s1">'Cannot add "</span><span class="si">%r</span><span class="s1">": the value for field "</span><span class="si">%s</span><span class="s1">" is None'</span> <span class="o">%</span> <span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">target_field_name</span><span class="p">)</span> <span class="p">)</span> <span class="n">new_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">fk_val</span><span class="p">)</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span> <span class="s2">"'</span><span class="si">%s</span><span class="s2">' instance expected, got </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</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">obj</span><span class="p">)</span> <span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">new_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="n">db</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="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="n">vals</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">through</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="n">db</span><span class="p">)</span> <span class="o">.</span><span class="n">values_list</span><span class="p">(</span><span class="n">target_field_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="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="p">{</span> <span class="n">source_field_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_val</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="n">target_field_name</span><span class="p">:</span> <span class="n">new_ids</span><span class="p">,</span> <span class="p">}))</span> <span class="n">new_ids</span> <span class="o">=</span> <span class="n">new_ids</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="n">vals</span><span class="p">)</span> <span class="k">with</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">db</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">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reverse</span> <span class="ow">or</span> <span class="n">source_field_name</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">:</span> <span class="c1"># Don't send the signal when we are inserting the</span> <span class="c1"># duplicate data row for symmetrical reverse entries.</span> <span class="n">signals</span><span class="o">.</span><span class="n">m2m_changed</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">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'pre_add'</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reverse</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">pk_set</span><span class="o">=</span><span class="n">new_ids</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="n">db</span><span class="p">)</span> <span class="c1"># Add the ones that aren't there already</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</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="n">db</span><span class="p">)</span><span class="o">.</span><span class="n">bulk_create</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</span><span class="p">(</span><span class="o">**</span><span class="p">{</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">_id'</span> <span class="o">%</span> <span class="n">source_field_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_val</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">_id'</span> <span class="o">%</span> <span class="n">target_field_name</span><span class="p">:</span> <span class="n">obj_id</span><span class="p">,</span> <span class="p">})</span> <span class="k">for</span> <span class="n">obj_id</span> <span class="ow">in</span> <span class="n">new_ids</span> <span class="p">])</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reverse</span> <span class="ow">or</span> <span class="n">source_field_name</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">:</span> <span class="c1"># Don't send the signal when we are inserting the</span> <span class="c1"># duplicate data row for symmetrical reverse entries.</span> <span class="n">signals</span><span class="o">.</span><span class="n">m2m_changed</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">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'post_add'</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reverse</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">pk_set</span><span class="o">=</span><span class="n">new_ids</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="n">db</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_remove_items</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">source_field_name</span><span class="p">,</span> <span class="n">target_field_name</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">):</span> <span class="c1"># source_field_name: the PK colname in join table for the source object</span> <span class="c1"># target_field_name: the PK colname in join table for the target object</span> <span class="c1"># *objs - objects to remove</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">objs</span><span class="p">:</span> <span class="k">return</span> <span class="c1"># Check that all the objects are of the right type</span> <span class="n">old_ids</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">):</span> <span class="n">fk_val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="o">.</span><span class="n">get_foreign_related_value</span><span class="p">(</span><span class="n">obj</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="n">old_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">fk_val</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">old_ids</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="n">db</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="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">with</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">db</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="c1"># Send a signal to the other end if need be.</span> <span class="n">signals</span><span class="o">.</span><span class="n">m2m_changed</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">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"pre_remove"</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reverse</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">pk_set</span><span class="o">=</span><span class="n">old_ids</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="n">db</span><span class="p">)</span> <span class="n">target_model_qs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyRelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span> <span class="k">if</span> <span class="n">target_model_qs</span><span class="o">.</span><span class="n">_has_filters</span><span class="p">():</span> <span class="n">old_vals</span> <span class="o">=</span> <span class="n">target_model_qs</span><span class="o">.</span><span class="n">using</span><span class="p">(</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="p">{</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">__in'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="o">.</span><span class="n">related_field</span><span class="o">.</span><span class="n">attname</span><span class="p">:</span> <span class="n">old_ids</span><span class="p">})</span> <span class="k">else</span><span class="p">:</span> <span class="n">old_vals</span> <span class="o">=</span> <span class="n">old_ids</span> <span class="n">filters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_remove_filters</span><span class="p">(</span><span class="n">old_vals</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</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="n">db</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">filters</span><span class="p">)</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span> <span class="n">signals</span><span class="o">.</span><span class="n">m2m_changed</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">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"post_remove"</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reverse</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">pk_set</span><span class="o">=</span><span class="n">old_ids</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="n">db</span><span class="p">)</span> <span class="k">return</span> <span class="n">ManyRelatedManager</span> <span class="k">class</span> <span class="nc">ManyRelatedObjectsDescriptor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># This class provides the functionality that makes the related-object</span> <span class="c1"># managers available as attributes on a model class, for fields that have</span> <span class="c1"># multiple "remote" values and have a ManyToManyField pointed at them by</span> <span class="c1"># some other model (rather than having a ManyToManyField themselves).</span> <span class="c1"># In the example "publication.article_set", the article_set attribute is a</span> <span class="c1"># ManyRelatedObjectsDescriptor instance.</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">related</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span> <span class="o">=</span> <span class="n">related</span> <span class="c1"># RelatedObject instance</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">related_manager_cls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Dynamically create a class that subclasses the related</span> <span class="c1"># model's default manager.</span> <span class="k">return</span> <span class="n">create_many_related_manager</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">__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="n">instance_type</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">rel_model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_manager_cls</span><span class="p">(</span> <span class="n">model</span><span class="o">=</span><span class="n">rel_model</span><span class="p">,</span> <span class="n">query_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">prefetch_cache_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">related</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="n">instance</span><span class="o">=</span><span class="n">instance</span><span class="p">,</span> <span class="n">symmetrical</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">source_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">m2m_reverse_field_name</span><span class="p">(),</span> <span class="n">target_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">m2m_field_name</span><span class="p">(),</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">through</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="p">)</span> <span class="k">return</span> <span class="n">manager</span> <span class="k">def</span> <span class="nf">__set__</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="n">value</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">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</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">auto_created</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">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span> <span class="s2">"Cannot set values on a ManyToManyField which specifies an "</span> <span class="s2">"intermediary model. Use </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">'s Manager instead."</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="p">)</span> <span class="p">)</span> <span class="c1"># Force evaluation of `value` in case it's a queryset whose</span> <span class="c1"># value could be affected by `manager.clear()`. Refs #19816.</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__get__</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span> <span class="n">db</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="n">manager</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">manager</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">with</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">db</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="n">manager</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span> <span class="n">manager</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="o">*</span><span class="n">value</span><span class="p">)</span> <span class="k">class</span> <span class="nc">ReverseManyRelatedObjectsDescriptor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># This class provides the functionality that makes the related-object</span> <span class="c1"># managers available as attributes on a model class, for fields that have</span> <span class="c1"># multiple "remote" values and have a ManyToManyField defined in their</span> <span class="c1"># model (rather than having another model pointed *at* them).</span> <span class="c1"># In the example "article.publications", the publications attribute is a</span> <span class="c1"># ReverseManyRelatedObjectsDescriptor instance.</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">m2m_field</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="n">m2m_field</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">through</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># through is provided so that you have easy access to the through</span> <span class="c1"># model (Book.authors.through) for inlines, etc. This is done as</span> <span class="c1"># a property to ensure that the fully resolved value is returned.</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">related_manager_cls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Dynamically create a class that subclasses the related model's</span> <span class="c1"># default manager.</span> <span class="k">return</span> <span class="n">create_many_related_manager</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">__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="n">instance_type</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">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_manager_cls</span><span class="p">(</span> <span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">query_field_name</span><span class="o">=</span><span class="bp">self</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="n">prefetch_cache_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">instance</span><span class="p">,</span> <span class="n">symmetrical</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">symmetrical</span><span class="p">,</span> <span class="n">source_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">m2m_field_name</span><span class="p">(),</span> <span class="n">target_field_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">m2m_reverse_field_name</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">through</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="p">)</span> <span class="k">return</span> <span class="n">manager</span> <span class="k">def</span> <span class="nf">__set__</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="n">value</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">field</span><span class="o">.</span><span class="n">rel</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">auto_created</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">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span> <span class="s2">"Cannot set values on a ManyToManyField which specifies an "</span> <span class="s2">"intermediary model. Use </span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">'s Manager instead."</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">opts</span><span class="o">.</span><span class="n">object_name</span><span class="p">)</span> <span class="p">)</span> <span class="c1"># Force evaluation of `value` in case it's a queryset whose</span> <span class="c1"># value could be affected by `manager.clear()`. Refs #19816.</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__get__</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span> <span class="n">db</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="n">manager</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">manager</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span> <span class="k">with</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">db</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="n">manager</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span> <span class="n">manager</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="o">*</span><span class="n">value</span><span class="p">)</span> <span class="k">class</span> <span class="nc">ForeignObjectRel</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># Field flags</span> <span class="n">auto_created</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">concrete</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">editable</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">is_relation</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">__init__</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">to</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">limit_choices_to</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parent_link</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">related_query_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="n">field</span> <span class="bp">self</span><span class="o">.</span><span class="n">to</span> <span class="o">=</span> <span class="n">to</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_name</span> <span class="o">=</span> <span class="n">related_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_query_name</span> <span class="o">=</span> <span class="n">related_query_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">limit_choices_to</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="n">limit_choices_to</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">limit_choices_to</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiple</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent_link</span> <span class="o">=</span> <span class="n">parent_link</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_delete</span> <span class="o">=</span> <span class="n">on_delete</span> <span class="bp">self</span><span class="o">.</span><span class="n">symmetrical</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># Some of the following cached_properties can't be initialized in</span> <span class="c1"># __init__ as the field doesn't have its model yet. Calling these methods</span> <span class="c1"># before field.contribute_to_class() has been called will result in</span> <span class="c1"># AttributeError</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">model</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">hidden</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">()</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</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="nd">@cached_property</span> <span class="k">def</span> <span class="nf">related_model</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">field</span><span class="o">.</span><span class="n">model</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span> <span class="s2">"This property can't be accessed before self.field.contribute_to_class has been called."</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">model</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">many_to_many</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">many_to_many</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">many_to_one</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">one_to_many</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">one_to_many</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">many_to_one</span> <span class="nd">@cached_property</span> <span class="k">def</span> <span class="nf">one_to_one</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">one_to_one</span> <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s1">'<</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">>'</span> <span class="o">%</span> <span class="p">(</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</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">related_model</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">related_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="p">,</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">get_choices</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">include_blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">blank_choice</span><span class="o">=</span><span class="n">BLANK_CHOICE_DASH</span><span class="p">,</span> <span class="n">limit_to_currently_related</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Returns choices with a default blank choices included, for use as</span> <span class="sd"> SelectField choices for this field.</span> <span class="sd"> Analog of django.db.models.fields.Field.get_choices(), provided</span> <span class="sd"> initially for utilization by RelatedFieldListFilter.</span> <span class="sd"> """</span> <span class="n">first_choice</span> <span class="o">=</span> <span class="n">blank_choice</span> <span class="k">if</span> <span class="n">include_blank</span> <span class="k">else</span> <span class="p">[]</span> <span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <span class="k">if</span> <span class="n">limit_to_currently_related</span><span class="p">:</span> <span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">complex_filter</span><span class="p">(</span> <span class="p">{</span><span class="s1">'</span><span class="si">%s</span><span class="s1">__isnull'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="p">:</span> <span class="kc">False</span><span class="p">}</span> <span class="p">)</span> <span class="n">lst</span> <span class="o">=</span> <span class="p">[(</span><span class="n">x</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">(),</span> <span class="n">smart_text</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">queryset</span><span class="p">]</span> <span class="k">return</span> <span class="n">first_choice</span> <span class="o">+</span> <span class="n">lst</span> <span class="k">def</span> <span class="nf">get_db_prep_lookup</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">value</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="c1"># Defer to the actual field definition for db prep</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_db_prep_lookup</span><span class="p">(</span><span class="n">lookup_type</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="n">prepared</span><span class="p">)</span> <span class="k">def</span> <span class="nf">is_hidden</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"Should the related object be hidden?"</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_name</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'+'</span> <span class="k">def</span> <span class="nf">get_joining_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_reverse_joining_columns</span><span class="p">()</span> <span class="k">def</span> <span class="nf">get_extra_restriction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">where_class</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">related_alias</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_extra_restriction</span><span class="p">(</span><span class="n">where_class</span><span class="p">,</span> <span class="n">related_alias</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> <span class="k">def</span> <span class="nf">set_field_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Sets the related field's name, this is not available until later stages</span> <span class="sd"> of app loading, so set_field_name is called from</span> <span class="sd"> set_attributes_from_rel()</span> <span class="sd"> """</span> <span class="c1"># By default foreign object doesn't relate to any remote field (for</span> <span class="c1"># example custom multicolumn joins currently have no remote field).</span> <span class="bp">self</span><span class="o">.</span><span class="n">field_name</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">get_accessor_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="c1"># This method encapsulates the logic that decides what name to give an</span> <span class="c1"># accessor descriptor that retrieves related many-to-one or</span> <span class="c1"># many-to-many objects. It uses the lower-cased object_name + "_set",</span> <span class="c1"># but this can be overridden with the "related_name" option.</span> <span class="c1"># Due to backwards compatibility ModelForms need to be able to provide</span> <span class="c1"># an alternate model. See BaseInlineFormSet.get_default_prefix().</span> <span class="n">opts</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span> <span class="k">if</span> <span class="n">model</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_meta</span> <span class="n">model</span> <span class="o">=</span> <span class="n">model</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiple</span><span class="p">:</span> <span class="c1"># If this is a symmetrical m2m relation on self, there is no reverse accessor.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">symmetrical</span> <span class="ow">and</span> <span class="n">model</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">to</span><span class="p">:</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_name</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_name</span> <span class="k">if</span> <span class="n">opts</span><span class="o">.</span><span class="n">default_related_name</span><span class="p">:</span> <span class="k">return</span> <span class="n">opts</span><span class="o">.</span><span class="n">default_related_name</span> <span class="o">%</span> <span class="p">{</span> <span class="s1">'model_name'</span><span class="p">:</span> <span class="n">opts</span><span class="o">.</span><span class="n">model_name</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="s1">'app_label'</span><span class="p">:</span> <span class="n">opts</span><span class="o">.</span><span class="n">app_label</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="p">}</span> <span class="k">return</span> <span class="n">opts</span><span class="o">.</span><span class="n">model_name</span> <span class="o">+</span> <span class="p">(</span><span class="s1">'_set'</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiple</span> <span class="k">else</span> <span class="s1">''</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_cache_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s2">"_</span><span class="si">%s</span><span class="s2">_cache"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">()</span> <span class="k">def</span> <span class="nf">get_path_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_reverse_path_info</span><span class="p">()</span> <span class="k">class</span> <span class="nc">ManyToOneRel</span><span class="p">(</span><span class="n">ForeignObjectRel</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</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">to</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">limit_choices_to</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parent_link</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">related_query_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyToOneRel</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span> <span class="n">field</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="n">related_name</span><span class="p">,</span> <span class="n">limit_choices_to</span><span class="o">=</span><span class="n">limit_choices_to</span><span class="p">,</span> <span class="n">parent_link</span><span class="o">=</span><span class="n">parent_link</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="n">on_delete</span><span class="p">,</span> <span class="n">related_query_name</span><span class="o">=</span><span class="n">related_query_name</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">field_name</span> <span class="o">=</span> <span class="n">field_name</span> <span class="k">def</span> <span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">state</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="o">.</span><span class="n">copy</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="s1">'related_model'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">return</span> <span class="n">state</span> <span class="k">def</span> <span class="nf">get_related_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Returns the Field in the 'to' object to which this relationship is</span> <span class="sd"> tied.</span> <span class="sd"> """</span> <span class="n">field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to</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="bp">self</span><span class="o">.</span><span class="n">field_name</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">field</span><span class="o">.</span><span class="n">concrete</span><span class="p">:</span> <span class="k">raise</span> <span class="n">FieldDoesNotExist</span><span class="p">(</span><span class="s2">"No related field named '</span><span class="si">%s</span><span class="s2">'"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">field_name</span><span class="p">)</span> <span class="k">return</span> <span class="n">field</span> <span class="k">def</span> <span class="nf">set_field_name</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">field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field_name</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">to</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">class</span> <span class="nc">OneToOneRel</span><span class="p">(</span><span class="n">ManyToOneRel</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</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">to</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">limit_choices_to</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parent_link</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">related_query_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">OneToOneRel</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="n">related_name</span><span class="p">,</span> <span class="n">limit_choices_to</span><span class="o">=</span><span class="n">limit_choices_to</span><span class="p">,</span> <span class="n">parent_link</span><span class="o">=</span><span class="n">parent_link</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="n">on_delete</span><span class="p">,</span> <span class="n">related_query_name</span><span class="o">=</span><span class="n">related_query_name</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiple</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">class</span> <span class="nc">ManyToManyRel</span><span class="p">(</span><span class="n">ForeignObjectRel</span><span class="p">):</span> <span class="k">def</span> <span class="nf">__init__</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">to</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">limit_choices_to</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">symmetrical</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">through</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">through_fields</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">db_constraint</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">related_query_name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">if</span> <span class="n">through</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">db_constraint</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Can't supply a through model and db_constraint=False"</span><span class="p">)</span> <span class="k">if</span> <span class="n">through_fields</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">through</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Cannot specify through_fields without a through model"</span><span class="p">)</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyToManyRel</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span> <span class="n">field</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="n">related_name</span><span class="p">,</span> <span class="n">limit_choices_to</span><span class="o">=</span><span class="n">limit_choices_to</span><span class="p">,</span> <span class="n">related_query_name</span><span class="o">=</span><span class="n">related_query_name</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">symmetrical</span> <span class="o">=</span> <span class="n">symmetrical</span> <span class="bp">self</span><span class="o">.</span><span class="n">multiple</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</span> <span class="o">=</span> <span class="n">through</span> <span class="bp">self</span><span class="o">.</span><span class="n">through_fields</span> <span class="o">=</span> <span class="n">through_fields</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_constraint</span> <span class="o">=</span> <span class="n">db_constraint</span> <span class="k">def</span> <span class="nf">is_hidden</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"Should the related object be hidden?"</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_name</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'+'</span> <span class="k">def</span> <span class="nf">get_related_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Returns the field in the 'to' object to which this relationship is tied.</span> <span class="sd"> Provided for symmetry with ManyToOneRel.</span> <span class="sd"> """</span> <span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">through_fields</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="bp">self</span><span class="o">.</span><span class="n">through_fields</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="k">for</span> <span class="n">field</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="n">rel</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">'rel'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">rel</span> <span class="ow">and</span> <span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">to</span><span class="p">:</span> <span class="k">break</span> <span class="k">return</span> <span class="n">field</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">class</span> <span class="nc">ForeignObject</span><span class="p">(</span><span class="n">RelatedField</span><span class="p">):</span> <span class="c1"># Field flags</span> <span class="n">many_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">many_to_one</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">one_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">one_to_one</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># For backwards compatibility; ignored as of Django 1.8.4.</span> <span class="n">allow_unsaved_instance_assignment</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">requires_unique_target</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">related_accessor_class</span> <span class="o">=</span> <span class="n">ForeignRelatedObjectsDescriptor</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">from_fields</span><span class="p">,</span> <span class="n">to_fields</span><span class="p">,</span> <span class="n">swappable</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">from_fields</span> <span class="o">=</span> <span class="n">from_fields</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_fields</span> <span class="o">=</span> <span class="n">to_fields</span> <span class="bp">self</span><span class="o">.</span><span class="n">swappable</span> <span class="o">=</span> <span class="n">swappable</span> <span class="k">if</span> <span class="s1">'rel'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'rel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ForeignObjectRel</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">related_name</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="s1">'related_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">related_query_name</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="s1">'related_query_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">limit_choices_to</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="s1">'limit_choices_to'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">parent_link</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="s1">'parent_link'</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span> <span class="n">on_delete</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="s1">'on_delete'</span><span class="p">,</span> <span class="n">CASCADE</span><span class="p">),</span> <span class="p">)</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'verbose_name'</span><span class="p">]</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="s1">'verbose_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignObject</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">errors</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignObject</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</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="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_unique_target</span><span class="p">())</span> <span class="k">return</span> <span class="n">errors</span> <span class="k">def</span> <span class="nf">_check_unique_target</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">rel_is_string</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="k">if</span> <span class="n">rel_is_string</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">requires_unique_target</span><span class="p">:</span> <span class="k">return</span> <span class="p">[]</span> <span class="c1"># Skip if the</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span> <span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span> <span class="k">return</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">rel</span> <span class="k">except</span> <span class="ne">AttributeError</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="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">:</span> <span class="k">return</span> <span class="p">[]</span> <span class="n">has_unique_field</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span><span class="n">rel_field</span><span class="o">.</span><span class="n">unique</span> <span class="k">for</span> <span class="n">rel_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">has_unique_field</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="n">field_combination</span> <span class="o">=</span> <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">"'</span><span class="si">%s</span><span class="s2">'"</span> <span class="o">%</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">rel_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="n">model_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">__name__</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">"None of the fields </span><span class="si">%s</span><span class="s2"> on model '</span><span class="si">%s</span><span class="s2">' have a unique=True constraint."</span> <span class="o">%</span> <span class="p">(</span><span class="n">field_combination</span><span class="p">,</span> <span class="n">model_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E310'</span><span class="p">,</span> <span class="p">)</span> <span class="p">]</span> <span class="k">elif</span> <span class="ow">not</span> <span class="n">has_unique_field</span><span class="p">:</span> <span class="n">field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="n">model_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">__name__</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="p">(</span><span class="s2">"'</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">' must set unique=True "</span> <span class="s2">"because it is referenced by a foreign key."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">model_name</span><span class="p">,</span> <span class="n">field_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E311'</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="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignObject</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'from_fields'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">from_fields</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to_fields'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_fields</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'related_name'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_query_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'related_query_name'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_query_name</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">on_delete</span> <span class="o">!=</span> <span class="n">CASCADE</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'on_delete'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">on_delete</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">parent_link</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'parent_link'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">parent_link</span> <span class="c1"># Work out string form of "to"</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="k">else</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">rel</span><span class="o">.</span><span class="n">to</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="c1"># If swappable is True, then see if we're actually pointing to the target</span> <span class="c1"># of a swap.</span> <span class="n">swappable_setting</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">swappable_setting</span> <span class="k">if</span> <span class="n">swappable_setting</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># If it's already a settings reference, error</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">],</span> <span class="s2">"setting_name"</span><span class="p">):</span> <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span><span class="o">.</span><span class="n">setting_name</span> <span class="o">!=</span> <span class="n">swappable_setting</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s2">"Cannot deconstruct a ForeignKey pointing to a model "</span> <span class="s2">"that is swapped in place of more than one model (</span><span class="si">%s</span><span class="s2"> and </span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span><span class="o">.</span><span class="n">setting_name</span><span class="p">,</span> <span class="n">swappable_setting</span><span class="p">)</span> <span class="p">)</span> <span class="c1"># Set it</span> <span class="kn">from</span> <span class="nn">django.db.migrations.writer</span> <span class="k">import</span> <span class="n">SettingsReference</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="n">SettingsReference</span><span class="p">(</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">],</span> <span class="n">swappable_setting</span><span class="p">,</span> <span class="p">)</span> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="k">def</span> <span class="nf">resolve_related_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">from_fields</span><span class="p">)</span> <span class="o"><</span> <span class="mi">1</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">from_fields</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">to_fields</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Foreign Object from and to fields must be the same non-zero length'</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Related model </span><span class="si">%r</span><span class="s1"> cannot be resolved'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">from_fields</span><span class="p">)):</span> <span class="n">from_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">from_fields</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="n">to_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_fields</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="n">from_field</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span> <span class="k">if</span> <span class="n">from_field_name</span> <span class="o">==</span> <span class="s1">'self'</span> <span class="k">else</span> <span class="bp">self</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">from_field_name</span><span class="p">))</span> <span class="n">to_field</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">to_field_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">to_field_name</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">from_field</span><span class="p">,</span> <span class="n">to_field</span><span class="p">))</span> <span class="k">return</span> <span class="n">related_fields</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">related_fields</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="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'_related_fields'</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_related_fields</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">resolve_related_fields</span><span class="p">()</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_related_fields</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">reverse_related_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="p">[(</span><span class="n">rhs_field</span><span class="p">,</span> <span class="n">lhs_field</span><span class="p">)</span> <span class="k">for</span> <span class="n">lhs_field</span><span class="p">,</span> <span class="n">rhs_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_fields</span><span class="p">]</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">local_related_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">lhs_field</span> <span class="k">for</span> <span class="n">lhs_field</span><span class="p">,</span> <span class="n">rhs_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_fields</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">foreign_related_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">rhs_field</span> <span class="k">for</span> <span class="n">lhs_field</span><span class="p">,</span> <span class="n">rhs_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_fields</span> <span class="k">if</span> <span class="n">rhs_field</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_local_related_value</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_instance_value_for_fields</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_related_fields</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_foreign_related_value</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_instance_value_for_fields</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="nd">@staticmethod</span> <span class="k">def</span> <span class="nf">get_instance_value_for_fields</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">fields</span><span class="p">):</span> <span class="n">ret</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">opts</span> <span class="o">=</span> <span class="n">instance</span><span class="o">.</span><span class="n">_meta</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span> <span class="c1"># Gotcha: in some cases (like fixture loading) a model can have</span> <span class="c1"># different values in parent_ptr_id and parent's id. So, use</span> <span class="c1"># instance.pk (that is, parent_ptr_id) when asked for instance.id.</span> <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">primary_key</span><span class="p">:</span> <span class="n">possible_parent_link</span> <span class="o">=</span> <span class="n">opts</span><span class="o">.</span><span class="n">get_ancestor_link</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">model</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">possible_parent_link</span> <span class="ow">or</span> <span class="n">possible_parent_link</span><span class="o">.</span><span class="n">primary_key</span> <span class="ow">or</span> <span class="n">possible_parent_link</span><span class="o">.</span><span class="n">model</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">ret</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span> <span class="k">continue</span> <span class="n">ret</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">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="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_attname_column</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">attname</span><span class="p">,</span> <span class="n">column</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignObject</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_attname_column</span><span class="p">()</span> <span class="k">return</span> <span class="n">attname</span><span class="p">,</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">get_joining_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reverse_join</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="n">source</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reverse_related_fields</span> <span class="k">if</span> <span class="n">reverse_join</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_fields</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">((</span><span class="n">lhs_field</span><span class="o">.</span><span class="n">column</span><span class="p">,</span> <span class="n">rhs_field</span><span class="o">.</span><span class="n">column</span><span class="p">)</span> <span class="k">for</span> <span class="n">lhs_field</span><span class="p">,</span> <span class="n">rhs_field</span> <span class="ow">in</span> <span class="n">source</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_reverse_joining_columns</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_joining_columns</span><span class="p">(</span><span class="n">reverse_join</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_extra_descriptor_filter</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="sd">"""</span> <span class="sd"> Returns an extra filter condition for related object fetching when</span> <span class="sd"> user does 'instance.fieldname', that is the extra filter is used in</span> <span class="sd"> the descriptor of the field.</span> <span class="sd"> The filter should be either a dict usable in .filter(**kwargs) call or</span> <span class="sd"> a Q-object. The condition will be ANDed together with the relation's</span> <span class="sd"> joining columns.</span> <span class="sd"> A parallel method is get_extra_restriction() which is used in</span> <span class="sd"> JOIN and subquery conditions.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="p">{}</span> <span class="k">def</span> <span class="nf">get_extra_restriction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">where_class</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">related_alias</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Returns a pair condition used for joining and subquery pushdown. The</span> <span class="sd"> condition is something that responds to as_sql(compiler, connection)</span> <span class="sd"> method.</span> <span class="sd"> Note that currently referring both the 'alias' and 'related_alias'</span> <span class="sd"> will not work in some conditions, like subquery pushdown.</span> <span class="sd"> A parallel method is get_extra_descriptor_filter() which is used in</span> <span class="sd"> instance.fieldname related object fetching.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">get_path_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Get path from this field to the related model.</span> <span class="sd"> """</span> <span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span> <span class="n">from_opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span> <span class="k">return</span> <span class="p">[</span><span class="n">PathInfo</span><span class="p">(</span><span class="n">from_opts</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</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="kc">True</span><span class="p">)]</span> <span class="k">def</span> <span class="nf">get_reverse_path_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Get path from the related model to this field's model.</span> <span class="sd"> """</span> <span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span> <span class="n">from_opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span> <span class="n">pathinfos</span> <span class="o">=</span> <span class="p">[</span><span class="n">PathInfo</span><span class="p">(</span><span class="n">from_opts</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">pk</span><span class="p">,),</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">unique</span><span class="p">,</span> <span class="kc">False</span><span class="p">)]</span> <span class="k">return</span> <span class="n">pathinfos</span> <span class="k">def</span> <span class="nf">get_lookup_constraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">constraint_class</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">targets</span><span class="p">,</span> <span class="n">sources</span><span class="p">,</span> <span class="n">lookups</span><span class="p">,</span> <span class="n">raw_value</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">django.db.models.sql.where</span> <span class="k">import</span> <span class="n">SubqueryConstraint</span><span class="p">,</span> <span class="n">AND</span><span class="p">,</span> <span class="n">OR</span> <span class="n">root_constraint</span> <span class="o">=</span> <span class="n">constraint_class</span><span class="p">()</span> <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">targets</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">sources</span><span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lookups</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">FieldError</span><span class="p">(</span><span class="s1">'Relation fields do not support nested lookups'</span><span class="p">)</span> <span class="n">lookup_type</span> <span class="o">=</span> <span class="n">lookups</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">def</span> <span class="nf">get_normalized_value</span><span class="p">(</span><span class="n">value</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">django.db.models</span> <span class="k">import</span> <span class="n">Model</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="n">Model</span><span class="p">):</span> <span class="n">value_list</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">sources</span><span class="p">:</span> <span class="c1"># Account for one-to-one relations when sent a different model</span> <span class="k">while</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">source</span><span class="o">.</span><span class="n">model</span><span class="p">)</span> <span class="ow">and</span> <span class="n">source</span><span class="o">.</span><span class="n">rel</span><span class="p">:</span> <span class="n">source</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">source</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</span><span class="p">)</span> <span class="n">value_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">source</span><span class="o">.</span><span class="n">attname</span><span class="p">))</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">value_list</span><span class="p">)</span> <span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</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">value</span><span class="p">,)</span> <span class="k">return</span> <span class="n">value</span> <span class="n">is_multicolumn</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">related_fields</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span> <span class="k">if</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">raw_value</span><span class="p">,</span> <span class="s1">'_as_sql'</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">raw_value</span><span class="p">,</span> <span class="s1">'get_compiler'</span><span class="p">)):</span> <span class="n">root_constraint</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">SubqueryConstraint</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">column</span> <span class="k">for</span> <span class="n">target</span> <span class="ow">in</span> <span class="n">targets</span><span class="p">],</span> <span class="p">[</span><span class="n">source</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">source</span> <span class="ow">in</span> <span class="n">sources</span><span class="p">],</span> <span class="n">raw_value</span><span class="p">),</span> <span class="n">AND</span><span class="p">)</span> <span class="k">elif</span> <span class="n">lookup_type</span> <span class="o">==</span> <span class="s1">'isnull'</span><span class="p">:</span> <span class="n">root_constraint</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">IsNull</span><span class="p">(</span><span class="n">targets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_col</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">sources</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">raw_value</span><span class="p">),</span> <span class="n">AND</span><span class="p">)</span> <span class="k">elif</span> <span class="p">(</span><span class="n">lookup_type</span> <span class="o">==</span> <span class="s1">'exact'</span> <span class="ow">or</span> <span class="p">(</span><span class="n">lookup_type</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'gt'</span><span class="p">,</span> <span class="s1">'lt'</span><span class="p">,</span> <span class="s1">'gte'</span><span class="p">,</span> <span class="s1">'lte'</span><span class="p">]</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">is_multicolumn</span><span class="p">)):</span> <span class="n">value</span> <span class="o">=</span> <span class="n">get_normalized_value</span><span class="p">(</span><span class="n">raw_value</span><span class="p">)</span> <span class="k">for</span> <span class="n">target</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">targets</span><span class="p">,</span> <span class="n">sources</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="n">lookup_class</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">get_lookup</span><span class="p">(</span><span class="n">lookup_type</span><span class="p">)</span> <span class="n">root_constraint</span><span class="o">.</span><span class="n">add</span><span class="p">(</span> <span class="n">lookup_class</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">get_col</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">source</span><span class="p">),</span> <span class="n">val</span><span class="p">),</span> <span class="n">AND</span><span class="p">)</span> <span class="k">elif</span> <span class="n">lookup_type</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'range'</span><span class="p">,</span> <span class="s1">'in'</span><span class="p">]</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">is_multicolumn</span><span class="p">:</span> <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">get_normalized_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">raw_value</span><span class="p">]</span> <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">val</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">values</span><span class="p">]</span> <span class="n">lookup_class</span> <span class="o">=</span> <span class="n">targets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_lookup</span><span class="p">(</span><span class="n">lookup_type</span><span class="p">)</span> <span class="n">root_constraint</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">lookup_class</span><span class="p">(</span><span class="n">targets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_col</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">sources</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">value</span><span class="p">),</span> <span class="n">AND</span><span class="p">)</span> <span class="k">elif</span> <span class="n">lookup_type</span> <span class="o">==</span> <span class="s1">'in'</span><span class="p">:</span> <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">get_normalized_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">raw_value</span><span class="p">]</span> <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span> <span class="n">value_constraint</span> <span class="o">=</span> <span class="n">constraint_class</span><span class="p">()</span> <span class="k">for</span> <span class="n">source</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">sources</span><span class="p">,</span> <span class="n">targets</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="n">lookup_class</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">get_lookup</span><span class="p">(</span><span class="s1">'exact'</span><span class="p">)</span> <span class="n">lookup</span> <span class="o">=</span> <span class="n">lookup_class</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">get_col</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">source</span><span class="p">),</span> <span class="n">val</span><span class="p">)</span> <span class="n">value_constraint</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">lookup</span><span class="p">,</span> <span class="n">AND</span><span class="p">)</span> <span class="n">root_constraint</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">value_constraint</span><span class="p">,</span> <span class="n">OR</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Related Field got invalid lookup: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">lookup_type</span><span class="p">)</span> <span class="k">return</span> <span class="n">root_constraint</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">attnames</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">attname</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">local_related_fields</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_defaults</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">get_default</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">local_related_fields</span><span class="p">)</span> <span class="k">def</span> <span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">virtual_only</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignObject</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">virtual_only</span><span class="o">=</span><span class="n">virtual_only</span><span class="p">)</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">ReverseSingleRelatedObjectDescriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span> <span class="k">def</span> <span class="nf">contribute_to_related_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">related</span><span class="p">):</span> <span class="c1"># Internal FK's - i.e., those with a related name ending with '+' -</span> <span class="c1"># and swapped models don't get a related descriptor.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">related</span><span class="o">.</span><span class="n">related_model</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="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">related</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_accessor_class</span><span class="p">(</span><span class="n">related</span><span class="p">))</span> <span class="c1"># While 'limit_choices_to' might be a callable, simply pass</span> <span class="c1"># it along for later - this is too early because it's still</span> <span class="c1"># model load time.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">limit_choices_to</span><span class="p">:</span> <span class="n">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">related_fkey_lookups</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">rel</span><span class="o">.</span><span class="n">limit_choices_to</span><span class="p">)</span> <div class="viewcode-block" id="ForeignKey"><a class="viewcode-back" href="../../../../../ref/models/fields.html#django.db.models.ForeignKey">[docs]</a><span class="k">class</span> <span class="nc">ForeignKey</span><span class="p">(</span><span class="n">ForeignObject</span><span class="p">):</span> <span class="c1"># Field flags</span> <span class="n">many_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">many_to_one</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">one_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">one_to_one</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'invalid'</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s1">'</span><span class="si">%(model)s</span><span class="s1"> instance with </span><span class="si">%(field)s</span><span class="s1"> </span><span class="si">%(value)r</span><span class="s1"> does not exist.'</span><span class="p">)</span> <span class="p">}</span> <span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Foreign Key (type determined by related field)"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">to_field</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">rel_class</span><span class="o">=</span><span class="n">ManyToOneRel</span><span class="p">,</span> <span class="n">db_constraint</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="c1"># to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">),</span> <span class="p">(</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">(</span><span class="si">%r</span><span class="s2">) is invalid. First parameter to ForeignKey must be "</span> <span class="s2">"either a model, a model name, or the string </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">RECURSIVE_RELATIONSHIP_CONSTANT</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># For backwards compatibility purposes, we need to *try* and set</span> <span class="c1"># the to_field during FK construction. It won't be guaranteed to</span> <span class="c1"># be correct until contribute_to_class is called. Refs #12190.</span> <span class="n">to_field</span> <span class="o">=</span> <span class="n">to_field</span> <span class="ow">or</span> <span class="p">(</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span> <span class="ow">and</span> <span class="n">to</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="k">if</span> <span class="s1">'db_index'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'db_index'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_constraint</span> <span class="o">=</span> <span class="n">db_constraint</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'rel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">rel_class</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">to_field</span><span class="p">,</span> <span class="n">related_name</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="s1">'related_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">related_query_name</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="s1">'related_query_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">limit_choices_to</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="s1">'limit_choices_to'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">parent_link</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="s1">'parent_link'</span><span class="p">,</span> <span class="kc">False</span><span class="p">),</span> <span class="n">on_delete</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="s1">'on_delete'</span><span class="p">,</span> <span class="n">CASCADE</span><span class="p">),</span> <span class="p">)</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="p">[</span><span class="s1">'self'</span><span class="p">],</span> <span class="p">[</span><span class="n">to_field</span><span class="p">],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">errors</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</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="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_on_delete</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">self</span><span class="o">.</span><span class="n">_check_unique</span><span class="p">())</span> <span class="k">return</span> <span class="n">errors</span> <span class="k">def</span> <span class="nf">_check_on_delete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">on_delete</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'on_delete'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">on_delete</span> <span class="o">==</span> <span class="n">SET_NULL</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</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="s1">'Field specifies on_delete=SET_NULL, but cannot be null.'</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="s1">'Set null=True argument on the field, or change the on_delete rule.'</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E320'</span><span class="p">,</span> <span class="p">)</span> <span class="p">]</span> <span class="k">elif</span> <span class="n">on_delete</span> <span class="o">==</span> <span class="n">SET_DEFAULT</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_default</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="s1">'Field specifies on_delete=SET_DEFAULT, but has no default value.'</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="s1">'Set a default value, or change the on_delete rule.'</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E321'</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="k">def</span> <span class="nf">_check_unique</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">return</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="s1">'Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.'</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="s1">'ForeignKey(unique=True) is usually better served by a OneToOneField.'</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.W342'</span><span class="p">,</span> <span class="p">)</span> <span class="p">]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unique</span> <span class="k">else</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span> <span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to_fields'</span><span class="p">]</span> <span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'from_fields'</span><span class="p">]</span> <span class="c1"># Handle the simpler arguments</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_index</span><span class="p">:</span> <span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'db_index'</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'db_index'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_constraint</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">True</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'db_constraint'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_constraint</span> <span class="c1"># Rel needs more work.</span> <span class="n">to_meta</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="s2">"_meta"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="n">to_meta</span> <span class="ow">or</span> <span class="p">(</span><span class="n">to_meta</span><span class="o">.</span><span class="n">pk</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</span> <span class="o">!=</span> <span class="n">to_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="n">kwargs</span><span class="p">[</span><span class="s1">'to_field'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</span> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">related_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">def</span> <span class="nf">get_reverse_path_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Get path from the related model to this field's model.</span> <span class="sd"> """</span> <span class="n">opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span> <span class="n">from_opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span> <span class="n">pathinfos</span> <span class="o">=</span> <span class="p">[</span><span class="n">PathInfo</span><span class="p">(</span><span class="n">from_opts</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">pk</span><span class="p">,),</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">unique</span><span class="p">,</span> <span class="kc">False</span><span class="p">)]</span> <span class="k">return</span> <span class="n">pathinfos</span> <span class="k">def</span> <span class="nf">validate</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="n">model_instance</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">parent_link</span><span class="p">:</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">using</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_read</span><span class="p">(</span><span class="n">model_instance</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="n">model_instance</span><span class="p">)</span> <span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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="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="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</span><span class="p">:</span> <span class="n">value</span><span class="p">}</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">complex_filter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_limit_choices_to</span><span class="p">())</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">qs</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span> <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s1">'invalid'</span><span class="p">],</span> <span class="n">code</span><span class="o">=</span><span class="s1">'invalid'</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="p">{</span> <span class="s1">'model'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span> <span class="s1">'pk'</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span> <span class="s1">'field'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</span><span class="p">,</span> <span class="s1">'value'</span><span class="p">:</span> <span class="n">value</span><span class="p">,</span> <span class="p">},</span> <span class="c1"># 'pk' is included for backwards compatibility</span> <span class="p">)</span> <span class="k">def</span> <span class="nf">get_attname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">_id'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="k">def</span> <span class="nf">get_attname_column</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">attname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_attname</span><span class="p">()</span> <span class="n">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_column</span> <span class="ow">or</span> <span class="n">attname</span> <span class="k">return</span> <span class="n">attname</span><span class="p">,</span> <span class="n">column</span> <span class="k">def</span> <span class="nf">get_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="s2">"Here we check if the default value is an object and return the to_field if so."</span> <span class="n">field_default</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_default</span><span class="p">()</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field_default</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">):</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field_default</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span> <span class="k">return</span> <span class="n">field_default</span> <span class="k">def</span> <span class="nf">get_db_prep_save</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="n">connection</span><span class="p">):</span> <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="p">(</span><span class="n">value</span> <span class="o">==</span> <span class="s1">''</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_field</span><span class="o">.</span><span class="n">empty_strings_allowed</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">interprets_empty_strings_as_nulls</span><span class="p">)):</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_field</span><span class="o">.</span><span class="n">get_db_prep_save</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_db_prep_value</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="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_field</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="p">)</span> <span class="k">def</span> <span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</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="c1"># In required many-to-one fields with only one available choice,</span> <span class="c1"># select that one available choice. Note: For SelectFields</span> <span class="c1"># we have to check that the length of choices is *2*, not 1,</span> <span class="c1"># because SelectFields always have an initial "blank" value.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">blank</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">:</span> <span class="n">choice_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_choices_default</span><span class="p">()</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">choice_list</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="k">return</span> <span class="n">smart_text</span><span class="p">(</span><span class="n">choice_list</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">value_to_string</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="k">def</span> <span class="nf">contribute_to_related_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">related</span><span class="p">):</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">contribute_to_related_class</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">related</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</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">rel</span><span class="o">.</span><span class="n">field_name</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="o">.</span><span class="n">name</span> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">db</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="s1">'using'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Cannot create form field for </span><span class="si">%r</span><span class="s2"> yet, because "</span> <span class="s2">"its related model </span><span class="si">%r</span><span class="s2"> has not been loaded yet"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</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">rel</span><span class="o">.</span><span class="n">to</span><span class="p">))</span> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'form_class'</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">ModelChoiceField</span><span class="p">,</span> <span class="s1">'queryset'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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="n">db</span><span class="p">),</span> <span class="s1">'to_field_name'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">field_name</span><span class="p">,</span> <span class="p">}</span> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span> <span class="k">def</span> <span class="nf">db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span> <span class="c1"># The database column type of a ForeignKey is the column type</span> <span class="c1"># of the field to which it points. An exception is if the ForeignKey</span> <span class="c1"># points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField,</span> <span class="c1"># in which case the column type is simply that of an IntegerField.</span> <span class="c1"># If the database needs similar types for key fields however, the only</span> <span class="c1"># thing we can do is making AutoField an IntegerField.</span> <span class="n">rel_field</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_field</span> <span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">rel_field</span><span class="p">,</span> <span class="n">AutoField</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">related_fields_match_type</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rel_field</span><span class="p">,</span> <span class="p">(</span><span class="n">PositiveIntegerField</span><span class="p">,</span> <span class="n">PositiveSmallIntegerField</span><span class="p">)))):</span> <span class="k">return</span> <span class="n">IntegerField</span><span class="p">()</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span> <span class="k">return</span> <span class="n">rel_field</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span> <span class="k">def</span> <span class="nf">db_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span> <span class="k">return</span> <span class="p">{</span><span class="s2">"type"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="p">),</span> <span class="s2">"check"</span><span class="p">:</span> <span class="p">[]}</span> <span class="k">def</span> <span class="nf">convert_empty_strings</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="n">expression</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span> <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">return</span> <span class="n">value</span> <span class="k">def</span> <span class="nf">get_db_converters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span> <span class="n">converters</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_db_converters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span> <span class="k">if</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="n">converters</span> <span class="o">+=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">convert_empty_strings</span><span class="p">]</span> <span class="k">return</span> <span class="n">converters</span> <span class="k">def</span> <span class="nf">get_col</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get_col</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="n">output_field</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_field</span><span class="p">)</span></div> <div class="viewcode-block" id="OneToOneField"><a class="viewcode-back" href="../../../../../ref/models/fields.html#django.db.models.OneToOneField">[docs]</a><span class="k">class</span> <span class="nc">OneToOneField</span><span class="p">(</span><span class="n">ForeignKey</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> A OneToOneField is essentially the same as a ForeignKey, with the exception</span> <span class="sd"> that always carries a "unique" constraint with it and the reverse relation</span> <span class="sd"> always returns the object pointed to (since there will only ever be one),</span> <span class="sd"> rather than returning a list.</span> <span class="sd"> """</span> <span class="c1"># Field flags</span> <span class="n">many_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">many_to_one</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">one_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">one_to_one</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">related_accessor_class</span> <span class="o">=</span> <span class="n">SingleRelatedObjectDescriptor</span> <span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"One-to-one relationship"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">to_field</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'unique'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span> <span class="nb">super</span><span class="p">(</span><span class="n">OneToOneField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">to_field</span><span class="p">,</span> <span class="n">OneToOneRel</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">OneToOneField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span> <span class="k">if</span> <span class="s2">"unique"</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span> <span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'unique'</span><span class="p">]</span> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">parent_link</span><span class="p">:</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">OneToOneField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">save_form_data</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="n">data</span><span class="p">):</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">):</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">data</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="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_check_unique</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="c1"># override ForeignKey since check isn't applicable here</span> <span class="k">return</span> <span class="p">[]</span></div> <span class="k">def</span> <span class="nf">create_many_to_many_intermediary_model</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span> <span class="kn">from</span> <span class="nn">django.db</span> <span class="k">import</span> <span class="n">models</span> <span class="n">managed</span> <span class="o">=</span> <span class="kc">True</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">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="o">!=</span> <span class="n">RECURSIVE_RELATIONSHIP_CONSTANT</span><span class="p">:</span> <span class="n">to_model</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="n">to</span> <span class="o">=</span> <span class="n">to_model</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="k">def</span> <span class="nf">set_managed</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</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">managed</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">managed</span> <span class="ow">or</span> <span class="n">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">managed</span> <span class="n">add_lazy_relation</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">to_model</span><span class="p">,</span> <span class="n">set_managed</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="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="n">to</span> <span class="o">=</span> <span class="n">klass</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span> <span class="n">to_model</span> <span class="o">=</span> <span class="n">klass</span> <span class="n">managed</span> <span class="o">=</span> <span class="n">klass</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">managed</span> <span class="k">else</span><span class="p">:</span> <span class="n">to</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span> <span class="n">to_model</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="n">managed</span> <span class="o">=</span> <span class="n">klass</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">managed</span> <span class="ow">or</span> <span class="n">to_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">managed</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">_</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">klass</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">field</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="o">==</span> <span class="n">RECURSIVE_RELATIONSHIP_CONSTANT</span> <span class="ow">or</span> <span class="n">to</span> <span class="o">==</span> <span class="n">klass</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">from_</span> <span class="o">=</span> <span class="s1">'from_</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">to</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="n">to</span> <span class="o">=</span> <span class="s1">'to_</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">to</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="n">from_</span> <span class="o">=</span> <span class="n">klass</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span> <span class="n">to</span> <span class="o">=</span> <span class="n">to</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="n">meta</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="s1">'Meta'</span><span class="p">),</span> <span class="p">(</span><span class="nb">object</span><span class="p">,),</span> <span class="p">{</span> <span class="s1">'db_table'</span><span class="p">:</span> <span class="n">field</span><span class="o">.</span><span class="n">_get_m2m_db_table</span><span class="p">(</span><span class="n">klass</span><span class="o">.</span><span class="n">_meta</span><span class="p">),</span> <span class="s1">'managed'</span><span class="p">:</span> <span class="n">managed</span><span class="p">,</span> <span class="s1">'auto_created'</span><span class="p">:</span> <span class="n">klass</span><span class="p">,</span> <span class="s1">'app_label'</span><span class="p">:</span> <span class="n">klass</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="s1">'db_tablespace'</span><span class="p">:</span> <span class="n">klass</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">db_tablespace</span><span class="p">,</span> <span class="s1">'unique_together'</span><span class="p">:</span> <span class="p">(</span><span class="n">from_</span><span class="p">,</span> <span class="n">to</span><span class="p">),</span> <span class="s1">'verbose_name'</span><span class="p">:</span> <span class="s1">'</span><span class="si">%(from)s</span><span class="s1">-</span><span class="si">%(to)s</span><span class="s1"> relationship'</span> <span class="o">%</span> <span class="p">{</span><span class="s1">'from'</span><span class="p">:</span> <span class="n">from_</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">:</span> <span class="n">to</span><span class="p">},</span> <span class="s1">'verbose_name_plural'</span><span class="p">:</span> <span class="s1">'</span><span class="si">%(from)s</span><span class="s1">-</span><span class="si">%(to)s</span><span class="s1"> relationships'</span> <span class="o">%</span> <span class="p">{</span><span class="s1">'from'</span><span class="p">:</span> <span class="n">from_</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">:</span> <span class="n">to</span><span class="p">},</span> <span class="s1">'apps'</span><span class="p">:</span> <span class="n">field</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">apps</span><span class="p">,</span> <span class="p">})</span> <span class="c1"># Construct and return the new class.</span> <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">,),</span> <span class="p">{</span> <span class="s1">'Meta'</span><span class="p">:</span> <span class="n">meta</span><span class="p">,</span> <span class="s1">'__module__'</span><span class="p">:</span> <span class="n">klass</span><span class="o">.</span><span class="n">__module__</span><span class="p">,</span> <span class="n">from_</span><span class="p">:</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span> <span class="n">klass</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">'</span><span class="si">%s</span><span class="s1">+'</span> <span class="o">%</span> <span class="n">name</span><span class="p">,</span> <span class="n">db_tablespace</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">db_tablespace</span><span class="p">,</span> <span class="n">db_constraint</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">db_constraint</span><span class="p">,</span> <span class="p">),</span> <span class="n">to</span><span class="p">:</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span> <span class="n">to_model</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">'</span><span class="si">%s</span><span class="s1">+'</span> <span class="o">%</span> <span class="n">name</span><span class="p">,</span> <span class="n">db_tablespace</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">db_tablespace</span><span class="p">,</span> <span class="n">db_constraint</span><span class="o">=</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">db_constraint</span><span class="p">,</span> <span class="p">)</span> <span class="p">})</span> <div class="viewcode-block" id="ManyToManyField"><a class="viewcode-back" href="../../../../../ref/models/fields.html#django.db.models.ManyToManyField">[docs]</a><span class="k">class</span> <span class="nc">ManyToManyField</span><span class="p">(</span><span class="n">RelatedField</span><span class="p">):</span> <span class="c1"># Field flags</span> <span class="n">many_to_many</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">many_to_one</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">one_to_many</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">one_to_one</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Many-to-many relationship"</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">db_constraint</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">swappable</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="n">to</span><span class="o">.</span><span class="n">_meta</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="c1"># to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT</span> <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">),</span> <span class="p">(</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">(</span><span class="si">%r</span><span class="s2">) is invalid. First parameter to ManyToManyField must be "</span> <span class="s2">"either a model, a model name, or the string </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">RECURSIVE_RELATIONSHIP_CONSTANT</span><span class="p">)</span> <span class="p">)</span> <span class="c1"># Class names must be ASCII in Python 2.x, so we forcibly coerce it</span> <span class="c1"># here to break early if there's a problem.</span> <span class="n">to</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">to</span><span class="p">)</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'verbose_name'</span><span class="p">]</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="s1">'verbose_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'rel'</span><span class="p">]</span> <span class="o">=</span> <span class="n">ManyToManyRel</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">related_name</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="s1">'related_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">related_query_name</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="s1">'related_query_name'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">limit_choices_to</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="s1">'limit_choices_to'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">symmetrical</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="s1">'symmetrical'</span><span class="p">,</span> <span class="n">to</span> <span class="o">==</span> <span class="n">RECURSIVE_RELATIONSHIP_CONSTANT</span><span class="p">),</span> <span class="n">through</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="s1">'through'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">through_fields</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="s1">'through_fields'</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">db_constraint</span><span class="o">=</span><span class="n">db_constraint</span><span class="p">,</span> <span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">swappable</span> <span class="o">=</span> <span class="n">swappable</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_table</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="s1">'db_table'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'rel'</span><span class="p">]</span><span class="o">.</span><span class="n">through</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_table</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">"Cannot specify a db_table if an intermediary model is used."</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyToManyField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">errors</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyToManyField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</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="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_unique</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="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_relationship_model</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="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_ignored_options</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="k">def</span> <span class="nf">_check_unique</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unique</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="s1">'ManyToManyFields cannot be unique.'</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E330'</span><span class="p">,</span> <span class="p">)</span> <span class="p">]</span> <span class="k">return</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">_check_ignored_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">warnings</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span><span class="p">:</span> <span class="n">warnings</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="s1">'null has no effect on ManyToManyField.'</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.W340'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_validators</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> <span class="n">warnings</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="s1">'ManyToManyField does not support validators.'</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.W341'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">return</span> <span class="n">warnings</span> <span class="k">def</span> <span class="nf">_check_relationship_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">from_model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="s1">'_meta'</span><span class="p">):</span> <span class="n">qualified_model_name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</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">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</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="n">qualified_model_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_models</span><span class="p">(</span><span class="n">include_auto_created</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="c1"># The relationship model is not installed.</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="p">(</span><span class="s2">"Field specifies a many-to-many relation through model "</span> <span class="s2">"'</span><span class="si">%s</span><span class="s2">', which has not been installed."</span><span class="p">)</span> <span class="o">%</span> <span class="n">qualified_model_name</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E331'</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">assert</span> <span class="n">from_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">,</span> \ <span class="s2">"ManyToManyField with intermediate "</span> \ <span class="s2">"tables cannot be checked if you don't pass the model "</span> \ <span class="s2">"where the field is attached to."</span> <span class="c1"># Set some useful local variables</span> <span class="n">to_model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="n">from_model_name</span> <span class="o">=</span> <span class="n">from_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">to_model</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="n">to_model_name</span> <span class="o">=</span> <span class="n">to_model</span> <span class="k">else</span><span class="p">:</span> <span class="n">to_model_name</span> <span class="o">=</span> <span class="n">to_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span> <span class="n">relationship_model_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</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">object_name</span> <span class="n">self_referential</span> <span class="o">=</span> <span class="n">from_model</span> <span class="o">==</span> <span class="n">to_model</span> <span class="c1"># Check symmetrical attribute.</span> <span class="k">if</span> <span class="p">(</span><span class="n">self_referential</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">symmetrical</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</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">auto_created</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">'Many-to-many fields with intermediate tables must not be symmetrical.'</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E332'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="c1"># Count foreign keys in intermediate model</span> <span class="k">if</span> <span class="n">self_referential</span><span class="p">:</span> <span class="n">seen_self</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">from_model</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">,</span> <span class="kc">None</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">rel</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">fields</span><span class="p">)</span> <span class="k">if</span> <span class="n">seen_self</span> <span class="o">></span> <span class="mi">2</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_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="p">(</span><span class="s2">"The model is used as an intermediate model by "</span> <span class="s2">"'</span><span class="si">%s</span><span class="s2">', but it has more than two foreign keys "</span> <span class="s2">"to '</span><span class="si">%s</span><span class="s2">', which is ambiguous. You must specify "</span> <span class="s2">"which two foreign keys Django should use via the "</span> <span class="s2">"through_fields keyword argument."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">from_model_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s2">"Use through_fields to specify which two "</span> <span class="s2">"foreign keys Django should use."</span><span class="p">),</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E333'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># Count foreign keys in relationship model</span> <span class="n">seen_from</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">from_model</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">,</span> <span class="kc">None</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">rel</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">fields</span><span class="p">)</span> <span class="n">seen_to</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">to_model</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">,</span> <span class="kc">None</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">rel</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">fields</span><span class="p">)</span> <span class="k">if</span> <span class="n">seen_from</span> <span class="o">></span> <span class="mi">1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_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="p">(</span><span class="s2">"The model is used as an intermediate model by "</span> <span class="s2">"'</span><span class="si">%s</span><span class="s2">', but it has more than one foreign key "</span> <span class="s2">"from '</span><span class="si">%s</span><span class="s2">', which is ambiguous. You must specify "</span> <span class="s2">"which foreign key Django should use via the "</span> <span class="s2">"through_fields keyword argument."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">from_model_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s1">'If you want to create a recursive relationship, '</span> <span class="s1">'use ForeignKey("self", symmetrical=False, '</span> <span class="s1">'through="</span><span class="si">%s</span><span class="s1">").'</span><span class="p">)</span> <span class="o">%</span> <span class="n">relationship_model_name</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E334'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">if</span> <span class="n">seen_to</span> <span class="o">></span> <span class="mi">1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_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="p">(</span><span class="s2">"The model is used as an intermediate model by "</span> <span class="s2">"'</span><span class="si">%s</span><span class="s2">', but it has more than one foreign key "</span> <span class="s2">"to '</span><span class="si">%s</span><span class="s2">', which is ambiguous. You must specify "</span> <span class="s2">"which foreign key Django should use via the "</span> <span class="s2">"through_fields keyword argument."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to_model_name</span><span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s1">'If you want to create a recursive '</span> <span class="s1">'relationship, use ForeignKey("self", '</span> <span class="s1">'symmetrical=False, through="</span><span class="si">%s</span><span class="s1">").'</span><span class="p">)</span> <span class="o">%</span> <span class="n">relationship_model_name</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E335'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">if</span> <span class="n">seen_from</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">seen_to</span> <span class="o">==</span> <span class="mi">0</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="p">(</span><span class="s2">"The model is used as an intermediate model by "</span> <span class="s2">"'</span><span class="si">%s</span><span class="s2">', but it does not have a foreign key to '</span><span class="si">%s</span><span class="s2">' or '</span><span class="si">%s</span><span class="s2">'."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">from_model_name</span><span class="p">,</span> <span class="n">to_model_name</span> <span class="p">),</span> <span class="n">hint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E336'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="c1"># Validate `through_fields`</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># Validate that we're given an iterable of at least two items</span> <span class="c1"># and that none of them is "falsy"</span> <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">2</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span><span class="p">[</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="p">(</span><span class="s2">"Field specifies 'through_fields' but does not "</span> <span class="s2">"provide the names of the two link fields that should be "</span> <span class="s2">"used for the relation through model "</span> <span class="s2">"'</span><span class="si">%s</span><span class="s2">'."</span><span class="p">)</span> <span class="o">%</span> <span class="n">qualified_model_name</span><span class="p">,</span> <span class="n">hint</span><span class="o">=</span><span class="p">(</span><span class="s2">"Make sure you specify 'through_fields' as "</span> <span class="s2">"through_fields=('field1', 'field2')"</span><span class="p">),</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E337'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="c1"># Validate the given through fields -- they should be actual</span> <span class="c1"># fields on the through model, and also be foreign keys to the</span> <span class="c1"># expected models</span> <span class="k">else</span><span class="p">:</span> <span class="k">assert</span> <span class="n">from_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">,</span> \ <span class="s2">"ManyToManyField with intermediate "</span> \ <span class="s2">"tables cannot be checked if you don't pass the model "</span> \ <span class="s2">"where the field is attached to."</span> <span class="n">source</span><span class="p">,</span> <span class="n">through</span><span class="p">,</span> <span class="n">target</span> <span class="o">=</span> <span class="n">from_model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="n">source_field_name</span><span class="p">,</span> <span class="n">target_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">related_model</span> <span class="ow">in</span> <span class="p">((</span><span class="n">source_field_name</span><span class="p">,</span> <span class="n">source</span><span class="p">),</span> <span class="p">(</span><span class="n">target_field_name</span><span class="p">,</span> <span class="n">target</span><span class="p">)):</span> <span class="n">possible_field_names</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">through</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="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">'rel'</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="n">related_model</span><span class="p">:</span> <span class="n">possible_field_names</span><span class="o">.</span><span class="n">append</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="k">if</span> <span class="n">possible_field_names</span><span class="p">:</span> <span class="n">hint</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"Did you mean one of the following foreign "</span> <span class="s2">"keys to '</span><span class="si">%s</span><span class="s2">': </span><span class="si">%s</span><span class="s2">?"</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="n">related_model</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="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">possible_field_names</span><span class="p">))</span> <span class="k">else</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">through</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">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="p">(</span><span class="s2">"The intermediary model '</span><span class="si">%s</span><span class="s2">' has no field '</span><span class="si">%s</span><span class="s2">'."</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span> <span class="n">qualified_model_name</span><span class="p">,</span> <span class="n">field_name</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">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E338'</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="ow">not</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s1">'rel'</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="n">related_model</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">"'</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">' is not a foreign key to '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span> <span class="n">through</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">field_name</span><span class="p">,</span> <span class="n">related_model</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="n">hint</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s1">'fields.E339'</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="k">def</span> <span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyToManyField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span> <span class="c1"># Handle the simpler arguments</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_table</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'db_table'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_table</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">db_constraint</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">True</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'db_constraint'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">db_constraint</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'related_name'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_query_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'related_query_name'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_query_name</span> <span class="c1"># Rel needs more work.</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="k">else</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">rel</span><span class="o">.</span><span class="n">to</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">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="p">,</span> <span class="s1">'through'</span><span class="p">,</span> <span class="kc">None</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="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'through'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</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">auto_created</span><span class="p">:</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'through'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</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">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</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">object_name</span><span class="p">)</span> <span class="c1"># If swappable is True, then see if we're actually pointing to the target</span> <span class="c1"># of a swap.</span> <span class="n">swappable_setting</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">swappable_setting</span> <span class="k">if</span> <span class="n">swappable_setting</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># If it's already a settings reference, error</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">],</span> <span class="s2">"setting_name"</span><span class="p">):</span> <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span><span class="o">.</span><span class="n">setting_name</span> <span class="o">!=</span> <span class="n">swappable_setting</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> <span class="s2">"Cannot deconstruct a ManyToManyField pointing to a "</span> <span class="s2">"model that is swapped in place of more than one model "</span> <span class="s2">"(</span><span class="si">%s</span><span class="s2"> and </span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span><span class="o">.</span><span class="n">setting_name</span><span class="p">,</span> <span class="n">swappable_setting</span><span class="p">)</span> <span class="p">)</span> <span class="c1"># Set it</span> <span class="kn">from</span> <span class="nn">django.db.migrations.writer</span> <span class="k">import</span> <span class="n">SettingsReference</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">]</span> <span class="o">=</span> <span class="n">SettingsReference</span><span class="p">(</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">'to'</span><span class="p">],</span> <span class="n">swappable_setting</span><span class="p">,</span> <span class="p">)</span> <span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="k">def</span> <span class="nf">_get_path_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">direct</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Called by both direct and indirect m2m traversal.</span> <span class="sd"> """</span> <span class="n">pathinfos</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">int_model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="n">linkfield1</span> <span class="o">=</span> <span class="n">int_model</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="bp">self</span><span class="o">.</span><span class="n">m2m_field_name</span><span class="p">())</span> <span class="n">linkfield2</span> <span class="o">=</span> <span class="n">int_model</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="bp">self</span><span class="o">.</span><span class="n">m2m_reverse_field_name</span><span class="p">())</span> <span class="k">if</span> <span class="n">direct</span><span class="p">:</span> <span class="n">join1infos</span> <span class="o">=</span> <span class="n">linkfield1</span><span class="o">.</span><span class="n">get_reverse_path_info</span><span class="p">()</span> <span class="n">join2infos</span> <span class="o">=</span> <span class="n">linkfield2</span><span class="o">.</span><span class="n">get_path_info</span><span class="p">()</span> <span class="k">else</span><span class="p">:</span> <span class="n">join1infos</span> <span class="o">=</span> <span class="n">linkfield2</span><span class="o">.</span><span class="n">get_reverse_path_info</span><span class="p">()</span> <span class="n">join2infos</span> <span class="o">=</span> <span class="n">linkfield1</span><span class="o">.</span><span class="n">get_path_info</span><span class="p">()</span> <span class="n">pathinfos</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join1infos</span><span class="p">)</span> <span class="n">pathinfos</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">join2infos</span><span class="p">)</span> <span class="k">return</span> <span class="n">pathinfos</span> <span class="k">def</span> <span class="nf">get_path_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_path_info</span><span class="p">(</span><span class="n">direct</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_reverse_path_info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_path_info</span><span class="p">(</span><span class="n">direct</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_choices_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="n">Field</span><span class="o">.</span><span class="n">get_choices</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">include_blank</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_get_m2m_db_table</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">opts</span><span class="p">):</span> <span class="s2">"Function that can be curried to provide the m2m table name for this relation"</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</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">db_table</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_table</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_table</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">utils</span><span class="o">.</span><span class="n">truncate_name</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">_</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">opts</span><span class="o">.</span><span class="n">db_table</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">),</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">def</span> <span class="nf">_get_m2m_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span> <span class="s2">"Function that can be curried to provide the source accessor or DB column name for the m2m table"</span> <span class="n">cache_attr</span> <span class="o">=</span> <span class="s1">'_m2m_</span><span class="si">%s</span><span class="s1">_cache'</span> <span class="o">%</span> <span class="n">attr</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cache_attr</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">cache_attr</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">link_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</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">link_field_name</span> <span class="o">=</span> <span class="kc">None</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">rel</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">fields</span><span class="p">:</span> <span class="k">if</span> <span class="p">(</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">rel</span><span class="o">.</span><span class="n">to</span> <span class="o">==</span> <span class="n">related</span><span class="o">.</span><span class="n">related_model</span> <span class="ow">and</span> <span class="p">(</span><span class="n">link_field_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">link_field_name</span> <span class="o">==</span> <span class="n">f</span><span class="o">.</span><span class="n">name</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">cache_attr</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">attr</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">cache_attr</span><span class="p">)</span> <span class="k">def</span> <span class="nf">_get_m2m_reverse_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span> <span class="s2">"Function that can be curried to provide the related accessor or DB column name for the m2m table"</span> <span class="n">cache_attr</span> <span class="o">=</span> <span class="s1">'_m2m_reverse_</span><span class="si">%s</span><span class="s1">_cache'</span> <span class="o">%</span> <span class="n">attr</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cache_attr</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">cache_attr</span><span class="p">)</span> <span class="n">found</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">link_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through_fields</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="n">link_field_name</span> <span class="o">=</span> <span class="kc">None</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">rel</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">fields</span><span class="p">:</span> <span class="c1"># NOTE f.rel.to != f.related_model</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">rel</span><span class="o">.</span><span class="n">to</span> <span class="o">==</span> <span class="n">related</span><span class="o">.</span><span class="n">model</span><span class="p">:</span> <span class="k">if</span> <span class="n">link_field_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">related</span><span class="o">.</span><span class="n">related_model</span> <span class="o">==</span> <span class="n">related</span><span class="o">.</span><span class="n">model</span><span class="p">:</span> <span class="c1"># If this is an m2m-intermediate to self,</span> <span class="c1"># the first foreign key you find will be</span> <span class="c1"># the source column. Keep searching for</span> <span class="c1"># the second foreign key.</span> <span class="k">if</span> <span class="n">found</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">cache_attr</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span> <span class="k">break</span> <span class="k">else</span><span class="p">:</span> <span class="n">found</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">elif</span> <span class="n">link_field_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">link_field_name</span> <span class="o">==</span> <span class="n">f</span><span class="o">.</span><span class="n">name</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">cache_attr</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">attr</span><span class="p">))</span> <span class="k">break</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">cache_attr</span><span class="p">)</span> <span class="k">def</span> <span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span> <span class="n">data</span> <span class="o">=</span> <span class="s1">''</span> <span class="k">if</span> <span class="n">obj</span><span class="p">:</span> <span class="n">qs</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">instance</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">()</span> <span class="k">for</span> <span class="n">instance</span> <span class="ow">in</span> <span class="n">qs</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="c1"># In required many-to-many fields with only one available choice,</span> <span class="c1"># select that one available choice.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">blank</span><span class="p">:</span> <span class="n">choices_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_choices_default</span><span class="p">()</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">choices_list</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">choices_list</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]]</span> <span class="k">return</span> <span class="n">smart_text</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="k">def</span> <span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="c1"># To support multiple relations to self, it's useful to have a non-None</span> <span class="c1"># related name on symmetrical relations for internal reasons. The</span> <span class="c1"># concept doesn't make a lot of sense externally ("you want me to</span> <span class="c1"># specify *what* on my non-reversible relation?!"), so we set it up</span> <span class="c1"># automatically. The funky name reduces the chance of an accidental</span> <span class="c1"># clash.</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">symmetrical</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</span> <span class="o">==</span> <span class="s2">"self"</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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">object_name</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">_rel_+"</span> <span class="o">%</span> <span class="n">name</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">():</span> <span class="c1"># If the backwards relation is disabled, replace the original</span> <span class="c1"># related_name with one generated from the m2m field name. Django</span> <span class="c1"># still uses backwards relations internally and we need to avoid</span> <span class="c1"># clashes between multiple m2m fields with related_name == '+'.</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">related_name</span> <span class="o">=</span> <span class="s2">"_</span><span class="si">%s</span><span class="s2">_</span><span class="si">%s</span><span class="s2">_+"</span> <span class="o">%</span> <span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">name</span><span class="p">)</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyToManyField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="c1"># The intermediate m2m model is not auto created if:</span> <span class="c1"># 1) There is a manually specified intermediate, or</span> <span class="c1"># 2) The class owning the m2m field is abstract.</span> <span class="c1"># 3) The class owning the m2m field has been swapped out.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">abstract</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">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="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="o">=</span> <span class="n">create_many_to_many_intermediary_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span> <span class="c1"># Add the descriptor for the m2m relation</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">ReverseManyRelatedObjectsDescriptor</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span> <span class="c1"># Set up the accessor for the m2m table name for the relation</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_db_table</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_m2m_db_table</span><span class="p">,</span> <span class="n">cls</span><span class="o">.</span><span class="n">_meta</span><span class="p">)</span> <span class="c1"># Populate some necessary rel arguments so that cross-app relations</span> <span class="c1"># work correctly.</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="k">def</span> <span class="nf">resolve_through_model</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">cls</span><span class="p">):</span> <span class="n">field</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">through</span> <span class="o">=</span> <span class="n">model</span> <span class="n">add_lazy_relation</span><span class="p">(</span><span class="n">cls</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">rel</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">resolve_through_model</span><span class="p">)</span> <span class="k">def</span> <span class="nf">contribute_to_related_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cls</span><span class="p">,</span> <span class="n">related</span><span class="p">):</span> <span class="c1"># Internal M2Ms (i.e., those with a related name ending with '+')</span> <span class="c1"># and swapped models don't get a related descriptor.</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">related</span><span class="o">.</span><span class="n">related_model</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="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">related</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">(),</span> <span class="n">ManyRelatedObjectsDescriptor</span><span class="p">(</span><span class="n">related</span><span class="p">))</span> <span class="c1"># Set up the accessors for the column names on the m2m table</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_column_name</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_m2m_attr</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="s1">'column'</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_reverse_name</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_m2m_reverse_attr</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="s1">'column'</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_field_name</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_m2m_attr</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_reverse_field_name</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_m2m_reverse_attr</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">)</span> <span class="n">get_m2m_rel</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_m2m_attr</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="s1">'rel'</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_target_field_name</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">get_m2m_rel</span><span class="p">()</span><span class="o">.</span><span class="n">field_name</span> <span class="n">get_m2m_reverse_rel</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_m2m_reverse_attr</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="s1">'rel'</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_reverse_target_field_name</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">get_m2m_reverse_rel</span><span class="p">()</span><span class="o">.</span><span class="n">field_name</span> <span class="k">def</span> <span class="nf">set_attributes_from_rel</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">pass</span> <span class="k">def</span> <span class="nf">value_from_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span> <span class="s2">"Returns the value of this field in the given model instance."</span> <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <span class="k">def</span> <span class="nf">save_form_data</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="n">data</span><span class="p">):</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="k">def</span> <span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="n">db</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="s1">'using'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'form_class'</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">ModelMultipleChoiceField</span><span class="p">,</span> <span class="s1">'queryset'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">to</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="n">db</span><span class="p">),</span> <span class="p">}</span> <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span> <span class="c1"># If initial is passed in, it's a list of related objects, but the</span> <span class="c1"># MultipleChoiceField takes a list of IDs.</span> <span class="k">if</span> <span class="n">defaults</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'initial'</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="n">initial</span> <span class="o">=</span> <span class="n">defaults</span><span class="p">[</span><span class="s1">'initial'</span><span class="p">]</span> <span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">initial</span><span class="p">):</span> <span class="n">initial</span> <span class="o">=</span> <span class="n">initial</span><span class="p">()</span> <span class="n">defaults</span><span class="p">[</span><span class="s1">'initial'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">.</span><span class="n">_get_pk_val</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">initial</span><span class="p">]</span> <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">ManyToManyField</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span> <span class="k">def</span> <span class="nf">db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span> <span class="c1"># A ManyToManyField is not represented by a single column,</span> <span class="c1"># so return None.</span> <span class="k">return</span> <span class="kc">None</span> <span class="k">def</span> <span class="nf">db_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span> <span class="k">return</span> <span class="p">{</span><span class="s2">"type"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">"check"</span><span class="p">:</span> <span class="kc">None</span><span class="p">}</span></div> </pre></div> </div> </div> </div> <div class="yui-b" id="sidebar"> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3>Browse</h3> <ul> </ul> <h3>You are here:</h3> <ul> <li> <a href="../../../../../index.html">Django 1.8.19 documentation</a> <ul><li><a href="../../../../index.html">Module code</a> <ul><li><a href="../../../../django.html">django</a> <ul><li><a href="../fields.html">django.db.models.fields</a> <ul><li>django.db.models.fields.related</li></ul> </li></ul></li></ul></li></ul> </li> </ul> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <form class="search" action="../../../../../search.html" method="get"> <div><input type="text" name="q" /></div> <div><input type="submit" value="Go" /></div> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <h3>Last update:</h3> <p class="topless">Mar 10, 2018</p> </div> </div> <div id="ft"> <div class="nav"> <a href="../../../../index.html" title="Module code" accesskey="U">up</a></div> </div> </div> <div class="clearer"></div> </div> </body> </html>