<!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="X-UA-Compatible" content="IE=Edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>django.db.models.fields.related — Django 1.11.20 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" id="documentation_options" data-url_root="../../../../../" src="../../../../../_static/documentation_options.js"></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> <script type="text/javascript" src="../../../../../_static/language_data.js"></script> <link rel="index" title="Index" href="../../../../../genindex.html" /> <link rel="search" title="Search" href="../../../../../search.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> <div class="document"> <div id="custom-doc" class="yui-t6"> <div id="hd"> <h1><a href="../../../../../index.html">Django 1.11.20 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">inspect</span> <span class="kn">import</span> <span class="nn">warnings</span> <span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">partial</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.db</span> <span class="k">import</span> <span class="n">connection</span><span class="p">,</span> <span class="n">router</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="kn">from</span> <span class="nn">django.db.models.constants</span> <span class="k">import</span> <span class="n">LOOKUP_SEP</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.query_utils</span> <span class="k">import</span> <span class="n">PathInfo</span> <span class="kn">from</span> <span class="nn">django.db.models.utils</span> <span class="k">import</span> <span class="n">make_model_tuple</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">RemovedInDjango20Warning</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="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.lru_cache</span> <span class="k">import</span> <span class="n">lru_cache</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="kn">from</span> <span class="nn">django.utils.version</span> <span class="k">import</span> <span class="n">get_docs_version</span> <span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">Field</span> <span class="kn">from</span> <span class="nn">.related_descriptors</span> <span class="k">import</span> <span class="p">(</span> <span class="n">ForwardManyToOneDescriptor</span><span class="p">,</span> <span class="n">ForwardOneToOneDescriptor</span><span class="p">,</span> <span class="n">ManyToManyDescriptor</span><span class="p">,</span> <span class="n">ReverseManyToOneDescriptor</span><span class="p">,</span> <span class="n">ReverseOneToOneDescriptor</span><span class="p">,</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">.related_lookups</span> <span class="k">import</span> <span class="p">(</span> <span class="n">RelatedExact</span><span class="p">,</span> <span class="n">RelatedGreaterThan</span><span class="p">,</span> <span class="n">RelatedGreaterThanOrEqual</span><span class="p">,</span> <span class="n">RelatedIn</span><span class="p">,</span> <span class="n">RelatedIsNull</span><span class="p">,</span> <span class="n">RelatedLessThan</span><span class="p">,</span> <span class="n">RelatedLessThanOrEqual</span><span class="p">,</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">.reverse_related</span> <span class="k">import</span> <span class="p">(</span> <span class="n">ForeignObjectRel</span><span class="p">,</span> <span class="n">ManyToManyRel</span><span class="p">,</span> <span class="n">ManyToOneRel</span><span class="p">,</span> <span class="n">OneToOneRel</span><span class="p">,</span> <span class="p">)</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">resolve_relation</span><span class="p">(</span><span class="n">scope_model</span><span class="p">,</span> <span class="n">relation</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> Transform relation into a model or fully-qualified model string of the form</span> <span class="sd"> "app_label.ModelName", relative to scope_model.</span> <span class="sd"> The relation argument can be:</span> <span class="sd"> * RECURSIVE_RELATIONSHIP_CONSTANT, i.e. the string "self", in which case</span> <span class="sd"> the model argument will be returned.</span> <span class="sd"> * A bare model name without an app_label, in which case scope_model's</span> <span class="sd"> app_label will be prepended.</span> <span class="sd"> * An "app_label.ModelName" string.</span> <span class="sd"> * A model class, which will be returned unchanged.</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">relation</span> <span class="o">=</span> <span class="n">scope_model</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">if</span> <span class="s2">"."</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">relation</span><span class="p">:</span> <span class="n">relation</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">scope_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">relation</span><span class="p">)</span> <span class="k">return</span> <span class="n">relation</span> <span class="k">def</span> <span class="nf">lazy_related_operation</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="o">*</span><span class="n">related_models</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"> Schedule `function` to be called once `model` and all `related_models`</span> <span class="sd"> have been imported and registered with the app registry. `function` will</span> <span class="sd"> be called with the newly-loaded model classes as its positional arguments,</span> <span class="sd"> plus any optional keyword arguments.</span> <span class="sd"> The `model` argument must be a model class. Each subsequent positional</span> <span class="sd"> argument is another model, or a reference to another model - see</span> <span class="sd"> `resolve_relation()` for the various forms these may take. Any relative</span> <span class="sd"> references will be resolved relative to `model`.</span> <span class="sd"> This is a convenience wrapper for `Apps.lazy_model_operation` - the app</span> <span class="sd"> registry model used is the one found in `model._meta.apps`.</span> <span class="sd"> """</span> <span class="n">models</span> <span class="o">=</span> <span class="p">[</span><span class="n">model</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">resolve_relation</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">rel</span><span class="p">)</span> <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">related_models</span><span class="p">]</span> <span class="n">model_keys</span> <span class="o">=</span> <span class="p">(</span><span class="n">make_model_tuple</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">models</span><span class="p">)</span> <span class="n">apps</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="k">return</span> <span class="n">apps</span><span class="o">.</span><span class="n">lazy_model_operation</span><span class="p">(</span><span class="n">partial</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">),</span> <span class="o">*</span><span class="n">model_keys</span><span class="p">)</span> <span class="k">def</span> <span class="nf">add_lazy_relation</span><span class="p">(</span><span class="bp">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="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> <span class="s2">"add_lazy_relation() has been superseded by lazy_related_operation() "</span> <span class="s2">"and related methods on the Apps class."</span><span class="p">,</span> <span class="n">RemovedInDjango20Warning</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># Rearrange args for new Apps.lazy_model_operation</span> <span class="k">def</span> <span class="nf">function</span><span class="p">(</span><span class="n">local</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span> <span class="k">return</span> <span class="n">operation</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="n">local</span><span class="p">)</span> <span class="n">lazy_related_operation</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">relation</span><span class="p">,</span> <span class="n">field</span><span class="o">=</span><span class="n">field</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="sd">"""</span> <span class="sd"> Base class that all relational fields inherit from.</span> <span class="sd"> """</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">remote_field</span><span class="o">.</span><span class="n">model</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_related_query_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">remote_field</span><span class="o">.</span><span class="n">related_name</span> <span class="k">if</span> <span class="n">related_name</span> <span class="ow">is</span> <span class="kc">None</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="sa">r</span><span class="s1">'^[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">remote_field</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_related_query_name_is_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">():</span> <span class="k">return</span> <span class="p">[]</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="n">errors</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="n">rel_query_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="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 '</span><span class="si">%s</span><span class="s2">' must not end with an underscore."</span> <span class="o">%</span> <span class="p">(</span><span class="n">rel_query_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 or related_query_name "</span> <span class="s2">"argument for this field."</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.E308'</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span> <span class="k">if</span> <span class="n">LOOKUP_SEP</span> <span class="ow">in</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 '</span><span class="si">%s</span><span class="s2">' must not contain '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">rel_query_name</span><span class="p">,</span> <span class="n">LOOKUP_SEP</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 or related_query_name "</span> <span class="s2">"argument for this field."</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.E309'</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">_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">remote_field</span><span class="o">.</span><span class="n">model</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">opts</span><span class="o">.</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">remote_field</span><span class="o">.</span><span class="n">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">model_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</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">remote_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">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">remote_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">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="s2">"Field defines a relation with model '</span><span class="si">%s</span><span class="s2">', which is either "</span> <span class="s2">"not installed, or is abstract."</span> <span class="o">%</span> <span class="n">model_name</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">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">remote_field</span><span class="o">.</span><span class="n">model</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">opts</span><span class="o">.</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">remote_field</span><span class="o">.</span><span class="n">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="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_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">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">remote_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">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_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">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="s2">"Field defines a relation with the model '</span><span class="si">%s</span><span class="s2">', which has "</span> <span class="s2">"been swapped out."</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">remote_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">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">"""</span> <span class="sd"> Check accessor and reverse query name clashes.</span> <span class="sd"> """</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.remote_field.model` 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">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">ModelBase</span><span class="p">):</span> <span class="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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</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">remote_field</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="c1"># By default related field will not have a column as it relates to</span> <span class="c1"># columns from 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="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">private_only</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</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">contribute_to_class</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">private_only</span><span class="o">=</span><span class="n">private_only</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">opts</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</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="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">related_name</span> <span class="k">else</span><span class="p">:</span> <span class="n">related_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">opts</span><span class="o">.</span><span class="n">default_related_name</span> <span class="k">if</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="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="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="s1">'model_name'</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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="bp">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">remote_field</span><span class="o">.</span><span class="n">related_name</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">remote_field</span><span class="o">.</span><span class="n">related_query_name</span><span class="p">:</span> <span class="n">related_query_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">remote_field</span><span class="o">.</span><span class="n">related_query_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="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="s1">'app_label'</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</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="k">def</span> <span class="nf">resolve_related_class</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">related</span> <span class="n">field</span><span class="o">.</span><span class="n">do_related_class</span><span class="p">(</span><span class="n">related</span><span class="p">,</span> <span class="n">model</span><span class="p">)</span> <span class="n">lazy_related_operation</span><span class="p">(</span><span class="n">resolve_related_class</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">field</span><span class="o">=</span><span class="bp">self</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="k">def</span> <span class="nf">get_reverse_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"> Complement to get_forward_related_filter(). Return the keyword</span> <span class="sd"> arguments that when passed to self.related_field.model.object.filter()</span> <span class="sd"> select all instances of self.related_field.model related through</span> <span class="sd"> this field to obj. obj is an instance of self.model.</span> <span class="sd"> """</span> <span class="n">base_filter</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">obj</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">related_fields</span> <span class="p">}</span> <span class="n">descriptor_filter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_extra_descriptor_filter</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="n">base_q</span> <span class="o">=</span> <span class="n">Q</span><span class="p">(</span><span class="o">**</span><span class="n">base_filter</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">descriptor_filter</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span> <span class="k">return</span> <span class="n">base_q</span> <span class="o">&</span> <span class="n">Q</span><span class="p">(</span><span class="o">**</span><span class="n">descriptor_filter</span><span class="p">)</span> <span class="k">elif</span> <span class="n">descriptor_filter</span><span class="p">:</span> <span class="k">return</span> <span class="n">base_q</span> <span class="o">&</span> <span class="n">descriptor_filter</span> <span class="k">return</span> <span class="n">base_q</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"> Get 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">remote_field</span><span class="o">.</span><span class="n">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_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span> <span class="k">else</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">remote_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">label</span> <span class="k">return</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_swappable_settings_name</span><span class="p">(</span><span class="n">to_string</span><span class="p">)</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="p">(</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">remote_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">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">remote_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">pk</span><span class="o">.</span><span class="n">name</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">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">remote_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">verbose_name</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">set_field_name</span><span class="p">()</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="bp">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="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">remote_field</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">"""</span> <span class="sd"> Return ``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">remote_field</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">remote_field</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">remote_field</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">"""</span> <span class="sd"> Pass ``limit_choices_to`` to the 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">remote_field</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">remote_field</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="sd">"""</span> <span class="sd"> Define the name that can be used to identify this related object in a</span> <span class="sd"> table-spanning query.</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</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">remote_field</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="nd">@property</span> <span class="k">def</span> <span class="nf">target_field</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> When filtering against this relation, returns the field on the remote</span> <span class="sd"> model against which the filtering should happen.</span> <span class="sd"> """</span> <span class="n">target_fields</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_path_info</span><span class="p">()[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">target_fields</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">target_fields</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="s2">"The relation has multiple target fields, but only single target field was asked for"</span><span class="p">)</span> <span class="k">return</span> <span class="n">target_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="sd">"""</span> <span class="sd"> Abstraction of the ForeignKey relation, supports multi-column relations.</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">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">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">ReverseManyToOneDescriptor</span> <span class="n">forward_related_accessor_class</span> <span class="o">=</span> <span class="n">ForwardManyToOneDescriptor</span> <span class="n">rel_class</span> <span class="o">=</span> <span class="n">ForeignObjectRel</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">on_delete</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">rel</span><span class="o">=</span><span class="kc">None</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">related_query_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">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">if</span> <span class="n">rel</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">rel</span> <span class="o">=</span> <span class="bp">self</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">related_name</span><span class="o">=</span><span class="n">related_name</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="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="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="fm">__init__</span><span class="p">(</span><span class="n">rel</span><span class="o">=</span><span class="n">rel</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">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_to_fields_exist</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_to_fields_exist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># Skip nonexistent models.</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span> <span class="k">return</span> <span class="p">[]</span> <span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">to_field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_fields</span><span class="p">:</span> <span class="k">if</span> <span class="n">to_field</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">remote_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">get_field</span><span class="p">(</span><span class="n">to_field</span><span class="p">)</span> <span class="k">except</span> <span class="n">exceptions</span><span class="o">.</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="s2">"The to_field '</span><span class="si">%s</span><span class="s2">' doesn't exist on the related "</span> <span class="s2">"model '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">to_field</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_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">label</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.E312'</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">_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">remote_field</span><span class="o">.</span><span class="n">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="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="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">exceptions</span><span class="o">.</span><span class="n">FieldDoesNotExist</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">unique_foreign_fields</span> <span class="o">=</span> <span class="p">{</span> <span class="nb">frozenset</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">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_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">get_fields</span><span class="p">()</span> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">'unique'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="p">}</span> <span class="n">unique_foreign_fields</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="nb">frozenset</span><span class="p">(</span><span class="n">ut</span><span class="p">)</span> <span class="k">for</span> <span class="n">ut</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_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">unique_together</span> <span class="p">})</span> <span class="n">foreign_fields</span> <span class="o">=</span> <span class="p">{</span><span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">}</span> <span class="n">has_unique_constraint</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span><span class="n">u</span> <span class="o"><=</span> <span class="n">foreign_fields</span> <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="n">unique_foreign_fields</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">has_unique_constraint</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">remote_field</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__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">"No subset of the fields </span><span class="si">%s</span><span class="s2"> on model '</span><span class="si">%s</span><span class="s2">' is unique."</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="p">(</span> <span class="s2">"Add unique=True on any of those fields or add at "</span> <span class="s2">"least a subset of them to a unique_together constraint."</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_constraint</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">remote_field</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__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">"'</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">' must set unique=True because it is referenced by "</span> <span class="s2">"a foreign key."</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">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">'on_delete'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">on_delete</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">remote_field</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">remote_field</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">remote_field</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">remote_field</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">remote_field</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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">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">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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_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">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_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">object_name</span><span class="p">,</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">remote_field</span><span class="o">.</span><span class="n">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="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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_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">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">remote_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">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"> Return 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"> Return 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">remote_field</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">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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</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="nd">@classmethod</span> <span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="k">def</span> <span class="nf">get_lookups</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="n">bases</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getmro</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span> <span class="n">bases</span> <span class="o">=</span> <span class="n">bases</span><span class="p">[:</span><span class="n">bases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">ForeignObject</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="n">class_lookups</span> <span class="o">=</span> <span class="p">[</span><span class="n">parent</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'class_lookups'</span><span class="p">,</span> <span class="p">{})</span> <span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">bases</span><span class="p">]</span> <span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">merge_dicts</span><span class="p">(</span><span class="n">class_lookups</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="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">private_only</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</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="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">private_only</span><span class="o">=</span><span class="n">private_only</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="nb">setattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="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">forward_related_accessor_class</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="bp">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">remote_field</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="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span><span class="p">,</span> <span class="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">remote_field</span><span class="o">.</span><span class="n">limit_choices_to</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</span><span class="o">.</span><span class="n">limit_choices_to</span><span class="p">)</span> <span class="n">ForeignObject</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">RelatedIn</span><span class="p">)</span> <span class="n">ForeignObject</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">RelatedExact</span><span class="p">)</span> <span class="n">ForeignObject</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">RelatedLessThan</span><span class="p">)</span> <span class="n">ForeignObject</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">RelatedGreaterThan</span><span class="p">)</span> <span class="n">ForeignObject</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">RelatedGreaterThanOrEqual</span><span class="p">)</span> <span class="n">ForeignObject</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">RelatedLessThanOrEqual</span><span class="p">)</span> <span class="n">ForeignObject</span><span class="o">.</span><span class="n">register_lookup</span><span class="p">(</span><span class="n">RelatedIsNull</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="sd">"""</span> <span class="sd"> Provide a many-to-one relation by adding a column to the local model</span> <span class="sd"> to hold the remote value.</span> <span class="sd"> By default ForeignKey will target the pk of the remote model but this</span> <span class="sd"> behavior can be changed by using the ``to_field`` argument.</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">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">rel_class</span> <span class="o">=</span> <span class="n">ManyToOneRel</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">on_delete</span><span class="o">=</span><span class="kc">None</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">related_query_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">to_field</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="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="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="vm">__class__</span><span class="o">.</span><span class="vm">__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="n">on_delete</span> <span class="ow">is</span> <span class="kc">None</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">"on_delete will be a required arg for </span><span class="si">%s</span><span class="s2"> in Django 2.0. Set "</span> <span class="s2">"it to models.CASCADE on models and in existing migrations "</span> <span class="s2">"if you want to maintain the current default behavior. "</span> <span class="s2">"See https://docs.djangoproject.com/en/</span><span class="si">%s</span><span class="s2">/ref/models/fields/"</span> <span class="s2">"#django.db.models.ForeignKey.on_delete"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">get_docs_version</span><span class="p">(),</span> <span class="p">),</span> <span class="n">RemovedInDjango20Warning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="n">on_delete</span> <span class="o">=</span> <span class="n">CASCADE</span> <span class="k">elif</span> <span class="ow">not</span> <span class="n">callable</span><span class="p">(</span><span class="n">on_delete</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">"The signature for </span><span class="si">{0}</span><span class="s2"> will change in Django 2.0. "</span> <span class="s2">"Pass to_field='</span><span class="si">{1}</span><span class="s2">' as a kwarg instead of as an arg."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">on_delete</span><span class="p">,</span> <span class="p">),</span> <span class="n">RemovedInDjango20Warning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="n">on_delete</span><span class="p">,</span> <span class="n">to_field</span> <span class="o">=</span> <span class="n">to_field</span><span class="p">,</span> <span class="n">on_delete</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="bp">self</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">related_name</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="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="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="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'db_index'</span><span class="p">,</span> <span class="kc">True</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="fm">__init__</span><span class="p">(</span> <span class="n">to</span><span class="p">,</span> <span class="n">on_delete</span><span class="p">,</span> <span class="n">from_fields</span><span class="o">=</span><span class="p">[</span><span class="s1">'self'</span><span class="p">],</span> <span class="n">to_fields</span><span class="o">=</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="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">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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</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">remote_field</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">remote_field</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">target_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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</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">remote_field</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="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</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">remote_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">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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">model</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">target_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">target_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">target_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">target_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">contribute_to_related_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">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="bp">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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">field_name</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</span><span class="o">.</span><span class="n">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="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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</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_check</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="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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="o">.</span><span class="n">rel_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="bp">self</span><span class="o">.</span><span class="n">db_check</span><span class="p">(</span><span class="n">connection</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">target_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 it always carries a "unique" constraint with it and the reverse</span> <span class="sd"> relation always returns the object pointed to (since there will only ever</span> <span class="sd"> be one), 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">ReverseOneToOneDescriptor</span> <span class="n">forward_related_accessor_class</span> <span class="o">=</span> <span class="n">ForwardOneToOneDescriptor</span> <span class="n">rel_class</span> <span class="o">=</span> <span class="n">OneToOneRel</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">on_delete</span><span class="o">=</span><span class="kc">None</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="k">if</span> <span class="n">on_delete</span> <span class="ow">is</span> <span class="kc">None</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">"on_delete will be a required arg for </span><span class="si">%s</span><span class="s2"> in Django 2.0. Set "</span> <span class="s2">"it to models.CASCADE on models and in existing migrations "</span> <span class="s2">"if you want to maintain the current default behavior. "</span> <span class="s2">"See https://docs.djangoproject.com/en/</span><span class="si">%s</span><span class="s2">/ref/models/fields/"</span> <span class="s2">"#django.db.models.ForeignKey.on_delete"</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">get_docs_version</span><span class="p">(),</span> <span class="p">),</span> <span class="n">RemovedInDjango20Warning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="n">on_delete</span> <span class="o">=</span> <span class="n">CASCADE</span> <span class="k">elif</span> <span class="ow">not</span> <span class="n">callable</span><span class="p">(</span><span class="n">on_delete</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">"The signature for </span><span class="si">{0}</span><span class="s2"> will change in Django 2.0. "</span> <span class="s2">"Pass to_field='</span><span class="si">{1}</span><span class="s2">' as a kwarg instead of as an arg."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">on_delete</span><span class="p">,</span> <span class="p">),</span> <span class="n">RemovedInDjango20Warning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="n">to_field</span> <span class="o">=</span> <span class="n">on_delete</span> <span class="n">on_delete</span> <span class="o">=</span> <span class="n">CASCADE</span> <span class="c1"># Avoid warning in superclass</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="fm">__init__</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">on_delete</span><span class="p">,</span> <span class="n">to_field</span><span class="o">=</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">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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">model</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="k">def</span> <span class="nf">set_managed</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">related</span><span class="p">,</span> <span class="n">through</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">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">related</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">managed</span> <span class="n">to_model</span> <span class="o">=</span> <span class="n">resolve_relation</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">)</span> <span class="n">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="n">lazy_related_operation</span><span class="p">(</span><span class="n">set_managed</span><span class="p">,</span> <span class="n">klass</span><span class="p">,</span> <span class="n">to_model</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="n">to</span> <span class="o">=</span> <span class="n">make_model_tuple</span><span class="p">(</span><span class="n">to_model</span><span class="p">)[</span><span class="mi">1</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="k">if</span> <span class="n">to</span> <span class="o">==</span> <span class="n">from_</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="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">from_</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">'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="n">_</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="p">)</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="n">_</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="p">)</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="vm">__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">remote_field</span><span class="o">.</span><span class="n">db_constraint</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="n">CASCADE</span><span class="p">,</span> <span class="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">remote_field</span><span class="o">.</span><span class="n">db_constraint</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="n">CASCADE</span><span class="p">,</span> <span class="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="sd">"""</span> <span class="sd"> Provide a many-to-many relation by using an intermediary model that</span> <span class="sd"> holds two ForeignKey fields pointed at the two sides of the relation.</span> <span class="sd"> Unless a ``through`` model was provided, ManyToManyField will use the</span> <span class="sd"> create_many_to_many_intermediary_model factory to automatically generate</span> <span class="sd"> the intermediary model.</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">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">rel_class</span> <span class="o">=</span> <span class="n">ManyToManyRel</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">related_name</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="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">None</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">db_table</span><span class="o">=</span><span class="kc">None</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="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="vm">__class__</span><span class="o">.</span><span class="vm">__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="k">if</span> <span class="n">symmetrical</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">symmetrical</span> <span class="o">=</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="k">if</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="n">db_table</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">,</span> <span class="p">(</span> <span class="s2">"Cannot specify a db_table if an intermediary model is used."</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="bp">self</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">related_name</span><span class="o">=</span><span class="n">related_name</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="n">limit_choices_to</span><span class="o">=</span><span class="n">limit_choices_to</span><span class="p">,</span> <span class="n">symmetrical</span><span class="o">=</span><span class="n">symmetrical</span><span class="p">,</span> <span class="n">through</span><span class="o">=</span><span class="n">through</span><span class="p">,</span> <span class="n">through_fields</span><span class="o">=</span><span class="n">through_fields</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">has_null_arg</span> <span class="o">=</span> <span class="s1">'null'</span> <span class="ow">in</span> <span class="n">kwargs</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="fm">__init__</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">db_table</span> <span class="o">=</span> <span class="n">db_table</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">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="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_table_uniqueness</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">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">has_null_arg</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">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">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">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">limit_choices_to</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">auto_created</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">'limit_choices_to has no effect on ManyToManyField '</span> <span class="s1">'with a through model.'</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.W343'</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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="vm">__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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">through</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">opts</span><span class="o">.</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="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="o">%</span> <span class="n">qualified_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.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="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="p">)</span> <span class="c1"># Set some useful local variables</span> <span class="n">to_model</span> <span class="o">=</span> <span class="n">resolve_relation</span><span class="p">(</span><span class="n">from_model</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="p">)</span> <span class="n">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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">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">remote_field</span><span class="p">,</span> <span class="s1">'model'</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</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="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="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="s2">"Use through_fields to specify which two 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">remote_field</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">remote_field</span><span class="p">,</span> <span class="s1">'model'</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</span><span class="p">,</span> <span class="s1">'model'</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</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, 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">remote_field</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="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="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 relationship, '</span> <span class="s1">'use ForeignKey("self", 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="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="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">obj</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="nb">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">remote_field</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">remote_field</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">remote_field</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">remote_field</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="s2">"Field specifies 'through_fields' but does not provide "</span> <span class="s2">"the names of the two link fields that should be used "</span> <span class="s2">"for the relation through model '</span><span class="si">%s</span><span class="s2">'."</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="s2">"Make sure you specify 'through_fields' as 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="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="p">)</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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</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">'remote_field'</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">remote_field</span><span class="p">,</span> <span class="s1">'model'</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="s2">"Did you mean one of the following foreign keys to '</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">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="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">exceptions</span><span class="o">.</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="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="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">'remote_field'</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">remote_field</span><span class="p">,</span> <span class="s1">'model'</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="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">_check_table_uniqueness</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="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">managed</span><span class="p">:</span> <span class="k">return</span> <span class="p">[]</span> <span class="n">registered_tables</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">db_table</span><span class="p">:</span> <span class="n">model</span> <span class="k">for</span> <span class="n">model</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">opts</span><span class="o">.</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="k">if</span> <span class="n">model</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</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">managed</span> <span class="p">}</span> <span class="n">m2m_db_table</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2m_db_table</span><span class="p">()</span> <span class="n">model</span> <span class="o">=</span> <span class="n">registered_tables</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">m2m_db_table</span><span class="p">)</span> <span class="c1"># The second condition allows multiple m2m relations on a model if</span> <span class="c1"># some point to a through model that proxies another through model.</span> <span class="k">if</span> <span class="n">model</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">concrete_model</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</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">auto_created</span><span class="p">:</span> <span class="k">def</span> <span class="nf">_get_field_name</span><span class="p">(</span><span class="n">model</span><span class="p">):</span> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">auto_created</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">many_to_many</span><span class="p">:</span> <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span> <span class="ow">is</span> <span class="n">model</span><span class="p">:</span> <span class="k">return</span> <span class="n">field</span><span class="o">.</span><span class="n">name</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="o">.</span><span class="n">auto_created</span><span class="o">.</span><span class="n">_meta</span> <span class="n">clashing_obj</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">opts</span><span class="o">.</span><span class="n">label</span><span class="p">,</span> <span class="n">_get_field_name</span><span class="p">(</span><span class="n">model</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="n">clashing_obj</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">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</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 field's intermediary table '</span><span class="si">%s</span><span class="s2">' clashes with the "</span> <span class="s2">"table name of '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="p">(</span><span class="n">m2m_db_table</span><span class="p">,</span> <span class="n">clashing_obj</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.E340'</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">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">remote_field</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">remote_field</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">remote_field</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">remote_field</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">remote_field</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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">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">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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_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">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_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">object_name</span><span class="p">,</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">remote_field</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">remote_field</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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span><span class="p">,</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="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">remote_field</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="c1"># Get join infos between the last model of join 1 and the first model</span> <span class="c1"># of join 2. Assume the only reason these may differ is due to model</span> <span class="c1"># inheritance.</span> <span class="n">join1_final</span> <span class="o">=</span> <span class="n">join1infos</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">to_opts</span> <span class="n">join2_initial</span> <span class="o">=</span> <span class="n">join2infos</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">from_opts</span> <span class="k">if</span> <span class="n">join1_final</span> <span class="ow">is</span> <span class="n">join2_initial</span><span class="p">:</span> <span class="n">intermediate_infos</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">elif</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">join1_final</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">join2_initial</span><span class="o">.</span><span class="n">model</span><span class="p">):</span> <span class="n">intermediate_infos</span> <span class="o">=</span> <span class="n">join1_final</span><span class="o">.</span><span class="n">get_path_to_parent</span><span class="p">(</span><span class="n">join2_initial</span><span class="o">.</span><span class="n">model</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">intermediate_infos</span> <span class="o">=</span> <span class="n">join2_initial</span><span class="o">.</span><span class="n">get_path_from_parent</span><span class="p">(</span><span class="n">join1_final</span><span class="o">.</span><span class="n">model</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">intermediate_infos</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_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="sd">"""</span> <span class="sd"> Function that can be curried to provide the m2m table name for this</span> <span class="sd"> relation.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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="n">m2m_table_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">utils</span><span class="o">.</span><span class="n">strip_quotes</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="k">return</span> <span class="n">utils</span><span class="o">.</span><span class="n">truncate_name</span><span class="p">(</span><span class="n">m2m_table_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="sd">"""</span> <span class="sd"> Function that can be curried to provide the source accessor or DB</span> <span class="sd"> column name for the m2m table.</span> <span class="sd"> """</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">remote_field</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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">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">remote_field</span><span class="o">.</span><span class="n">model</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="sd">"""</span> <span class="sd"> Function that can be curried to provide the related accessor or DB</span> <span class="sd"> column name for the m2m table.</span> <span class="sd"> """</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">remote_field</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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span> <span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">is_relation</span> <span class="ow">and</span> <span class="n">f</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">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="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">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">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">remote_field</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">remote_field</span><span class="o">.</span><span class="n">model</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">remote_field</span><span class="o">.</span><span class="n">model</span> <span class="o">==</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</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">remote_field</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">remote_field</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="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">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="bp">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">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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="p">:</span> <span class="k">def</span> <span class="nf">resolve_through_model</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span> <span class="o">=</span> <span class="n">model</span> <span class="n">lazy_related_operation</span><span class="p">(</span><span class="n">resolve_through_model</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">field</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span> <span class="k">elif</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">swapped</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">through</span> <span class="o">=</span> <span class="n">create_many_to_many_intermediary_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span> <span class="c1"># Add the descriptor for the m2m relation.</span> <span class="nb">setattr</span><span class="p">(</span><span class="bp">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">ManyToManyDescriptor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</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="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="bp">cls</span><span class="o">.</span><span class="n">_meta</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="bp">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">remote_field</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="bp">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">ManyToManyDescriptor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</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="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">'remote_field'</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">'remote_field'</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="sd">"""</span> <span class="sd"> Return the value of this field in the given model instance.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">obj</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">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">none</span><span class="p">()</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">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">attname</span><span class="p">)</span><span class="o">.</span><span class="n">set</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">remote_field</span><span class="o">.</span><span class="n">model</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_check</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="kc">None</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"> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <div class="searchformwrapper"> <form class="search" action="../../../../../search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <h3>Last update:</h3> <p class="topless">Feb 11, 2019</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>