{"title":"Model _meta API","version":"1.9","locale":"id","docname":"ref/models/meta","url":"/id/1.9/ref/models/meta/","canonical":"https://djangodocs.dev/id/1.9/ref/models/meta/","summary":"The model _meta API is at the core of the Django ORM. It enables other parts of the system such as lookups, queries, forms, and the admin to understand the…","html":"<span id=\"model-meta-api\"></span><h1>Model <code class=\"docutils literal notranslate\">_meta</code> API<a class=\"heading-anchor\" href=\"#module-django.db.models.options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.options.Options\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Options</span><a class=\"heading-anchor\" href=\"#django.db.models.options.Options\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>The model <code class=\"docutils literal notranslate\">_meta</code> API is at the core of the Django ORM. It enables other\nparts of the system such as lookups, queries, forms, and the admin to\nunderstand the capabilities of each model. The API is accessible through\nthe <code class=\"docutils literal notranslate\">_meta</code> attribute of each model class, which is an instance of an\n<code class=\"docutils literal notranslate\">django.db.models.options.Options</code> object.</p>\n<p>Methods that it provides can be used to:</p>\n<ul class=\"simple\">\n<li><p>Retrieve all field instances of a model</p></li>\n<li><p>Retrieve a single field instance of a model by name</p></li>\n</ul>\n<aside class=\"version-note version-changed\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>The Model <code class=\"docutils literal notranslate\">_meta</code> API has always existed as a Django internal, but\nwasn't formally documented and supported. As part of the effort to\nmake this API public, some of the already existing API entry points\nhave changed slightly. A <a class=\"reference internal\" href=\"#migrating-old-meta-api\"><span class=\"std std-ref\">migration guide</span></a>\nhas been provided to assist in converting your code to use the new,\nofficial API.</p>\n</aside>\n<section id=\"field-access-api\">\n<span id=\"model-meta-field-api\"></span><h2>Field access API<a class=\"heading-anchor\" href=\"#field-access-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"retrieving-a-single-field-instance-of-a-model-by-name\">\n<h3>Retrieving a single field instance of a model by name<a class=\"heading-anchor\" href=\"#retrieving-a-single-field-instance-of-a-model-by-name\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.options.Options.get_field\">\n<span class=\"sig-prename descclassname\">Options.</span><span class=\"sig-name descname\">get_field</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">field_name</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.options.Options.get_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns the field instance given a name of a field.</p>\n<p><code class=\"docutils literal notranslate\">field_name</code> can be the name of a field on the model, a field\non an abstract or inherited model, or a field defined on another\nmodel that points to the model. In the latter case, the <code class=\"docutils literal notranslate\">field_name</code>\nwill be the <code class=\"docutils literal notranslate\">related_name</code> defined by the user or the name automatically\ngenerated by Django itself.</p>\n<p><a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.hidden\" title=\"django.db.models.Field.hidden\"><code class=\"xref py py-attr docutils literal notranslate\">Hidden fields</code></a> cannot be retrieved\nby name.</p>\n<p>If a field with the given name is not found a\n<a class=\"reference internal\" href=\"/id/1.9/ref/exceptions/#django.core.exceptions.FieldDoesNotExist\" title=\"django.core.exceptions.FieldDoesNotExist\"><code class=\"xref py py-class docutils literal notranslate\">FieldDoesNotExist</code></a> exception will be\nraised.</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n\n<span class=\"go\"># A field on the model</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<span class=\"p\">(</span><span class=\"s1\">&#39;username&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;django.db.models.fields.CharField: username&gt;</span>\n\n<span class=\"go\"># A field from another model that has a relation with the current model</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<span class=\"p\">(</span><span class=\"s1\">&#39;logentry&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;ManyToOneRel: admin.logentry&gt;</span>\n\n<span class=\"go\"># A non existent field</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<span class=\"p\">(</span><span class=\"s1\">&#39;does_not_exist&#39;</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n    <span class=\"o\">...</span>\n<span class=\"gr\">FieldDoesNotExist</span>: User has no field named &#39;does_not_exist&#39;\n</code></pre></div>\n<aside class=\"version-note version-deprecated\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 1.8</p><p><span class=\"versionmodified deprecated\">Ditinggalkan sejak versi 1.8: </span><a class=\"reference internal\" href=\"#django.db.models.options.Options.get_field\" title=\"django.db.models.options.Options.get_field\"><code class=\"xref py py-meth docutils literal notranslate\">Options.get_field()</code></a> previously accepted a <code class=\"docutils literal notranslate\">many_to_many</code>\nparameter which could be set to <code class=\"docutils literal notranslate\">False</code> to avoid searching\n<code class=\"docutils literal notranslate\">ManyToManyField</code>s. The old behavior has been preserved for\nbackwards compatibility; however, the parameter and this behavior\nhas been deprecated.</p>\n<p>If you wish to filter out <code class=\"docutils literal notranslate\">ManyToManyField</code>s, you can inspect the\n<a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.many_to_many\" title=\"django.db.models.Field.many_to_many\"><code class=\"xref py py-attr docutils literal notranslate\">Field.many_to_many</code></a>\nattribute after calling <code class=\"docutils literal notranslate\">get_field()</code>.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"retrieving-all-field-instances-of-a-model\">\n<h3>Retrieving all field instances of a model<a class=\"heading-anchor\" href=\"#retrieving-all-field-instances-of-a-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.options.Options.get_fields\">\n<span class=\"sig-prename descclassname\">Options.</span><span class=\"sig-name descname\">get_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">include_parents<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">include_hidden<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.options.Options.get_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">New in Django 1.8</p></aside>\n<p>Returns a tuple of fields associated with a model. <code class=\"docutils literal notranslate\">get_fields()</code> accepts\ntwo parameters that can be used to control which fields are returned:</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\">include_parents</code></dt><dd><p><code class=\"docutils literal notranslate\">True</code> by default. Recursively includes fields defined on parent\nclasses. If set to <code class=\"docutils literal notranslate\">False</code>, <code class=\"docutils literal notranslate\">get_fields()</code> will only search for\nfields declared directly on the current model. Fields from models that\ndirectly inherit from abstract models or proxy classes are considered\nto be local, not on the parent.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\">include_hidden</code></dt><dd><p><code class=\"docutils literal notranslate\">False</code> by default. If set to <code class=\"docutils literal notranslate\">True</code>, <code class=\"docutils literal notranslate\">get_fields()</code> will include\nfields that are used to back other field's functionality. This will\nalso include any fields that have a <code class=\"docutils literal notranslate\">related_name</code> (such\nas <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>, or\n<a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>) that start with a &quot;+&quot;.</p>\n</dd>\n</dl>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n<span class=\"go\">(&lt;ManyToOneRel: admin.logentry&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.AutoField: id&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: password&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: last_login&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_superuser&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: username&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: first_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: last_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.EmailField: email&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_staff&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_active&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: date_joined&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: groups&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: user_permissions&gt;)</span>\n\n<span class=\"go\"># Also include hidden fields.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">(</span>include_hidden<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;ManyToOneRel: auth.user_groups&gt;,</span>\n<span class=\"go\"> &lt;ManyToOneRel: auth.user_user_permissions&gt;,</span>\n<span class=\"go\"> &lt;ManyToOneRel: admin.logentry&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.AutoField: id&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: password&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: last_login&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_superuser&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: username&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: first_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.CharField: last_name&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.EmailField: email&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_staff&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.BooleanField: is_active&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.DateTimeField: date_joined&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: groups&gt;,</span>\n<span class=\"go\"> &lt;django.db.models.fields.related.ManyToManyField: user_permissions&gt;)</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"migrating-from-the-old-api\">\n<span id=\"migrating-old-meta-api\"></span><h2>Migrating from the old API<a class=\"heading-anchor\" href=\"#migrating-from-the-old-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>As part of the formalization of the <code class=\"docutils literal notranslate\">Model._meta</code> API (from the\n<a class=\"reference internal\" href=\"#django.db.models.options.Options\" title=\"django.db.models.options.Options\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.options.Options</code></a> class), a number of methods and\nproperties have been deprecated and will be removed in Django 1.10.</p>\n<p>These old APIs can be replicated by either:</p>\n<ul class=\"simple\">\n<li><p>invoking <a class=\"reference internal\" href=\"#django.db.models.options.Options.get_field\" title=\"django.db.models.options.Options.get_field\"><code class=\"xref py py-meth docutils literal notranslate\">Options.get_field()</code></a>, or;</p></li>\n<li><p>invoking <a class=\"reference internal\" href=\"#django.db.models.options.Options.get_fields\" title=\"django.db.models.options.Options.get_fields\"><code class=\"xref py py-meth docutils literal notranslate\">Options.get_fields()</code></a> to retrieve a list of all\nfields, and then filtering this list using the <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#model-field-attributes\"><span class=\"std std-ref\">field attributes</span></a> that describe (or retrieve, in the case of\n<code class=\"docutils literal notranslate\">_with_model</code> variants) the properties of the desired fields.</p></li>\n</ul>\n<p>Although it's possible to make strictly equivalent replacements of the old\nmethods, that might not be the best approach. Taking the time to refactor any\nfield loops to make better use of the new API - and possibly include fields\nthat were previously excluded - will almost certainly result in better code.</p>\n<p>Assuming you have a model named <code class=\"docutils literal notranslate\">MyModel</code>, the following substitutions\ncan be made to convert your code to the new API:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_field(name)</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>f <span class=\"o\">=</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_field<span class=\"p\">(</span>name<span class=\"p\">)</span>\n</code></pre></div>\n<p>then check if:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">f.auto_created == False</code>, because the new <code class=\"docutils literal notranslate\">get_field()</code>\nAPI will find &quot;reverse&quot; relations, and:</p></li>\n<li><p><code class=\"docutils literal notranslate\">f.is_relation and f.related_model is None</code>, because the new\n<code class=\"docutils literal notranslate\">get_field()</code> API will find\n<a class=\"reference internal\" href=\"/id/1.9/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">GenericForeignKey</code></a> relations.</p></li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_field_by_name(name)</code> returns a tuple of these four\nvalues with the following replacements:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">field</code> can be found by <code class=\"docutils literal notranslate\">MyModel._meta.get_field(name)</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">model</code> can be found through the\n<a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.model\" title=\"django.db.models.Field.model\"><code class=\"xref py py-attr docutils literal notranslate\">model</code></a> attribute on the field.</p></li>\n<li><p><code class=\"docutils literal notranslate\">direct</code> can be found by: <code class=\"docutils literal notranslate\">not field.auto_created or field.concrete</code></p>\n<p>The <a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.auto_created\" title=\"django.db.models.Field.auto_created\"><code class=\"xref py py-attr docutils literal notranslate\">auto_created</code></a> check excludes\nall &quot;forward&quot; and &quot;reverse&quot; relations that are created by Django, but\nthis also includes <code class=\"docutils literal notranslate\">AutoField</code> and <code class=\"docutils literal notranslate\">OneToOneField</code> on proxy models.\nWe avoid filtering out these attributes using the\n<a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.concrete\" title=\"django.db.models.Field.concrete\"><code class=\"xref py py-attr docutils literal notranslate\">concrete</code></a> attribute.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">m2m</code> can be found through the\n<a class=\"reference internal\" href=\"/id/1.9/ref/models/fields/#django.db.models.Field.many_to_many\" title=\"django.db.models.Field.many_to_many\"><code class=\"xref py py-attr docutils literal notranslate\">many_to_many</code></a> attribute on the field.</p></li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_fields_with_model()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>is_relation\n        <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one\n        <span class=\"ow\">or</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>many_to_one <span class=\"ow\">and</span> f<span class=\"o\">.</span>related_model<span class=\"p\">)</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_concrete_fields_with_model()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>concrete <span class=\"ow\">and</span> <span class=\"p\">(</span>\n        <span class=\"ow\">not</span> f<span class=\"o\">.</span>is_relation\n        <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one\n        <span class=\"ow\">or</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>many_to_one <span class=\"ow\">and</span> f<span class=\"o\">.</span>related_model<span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_m2m_with_model()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>many_to_many <span class=\"ow\">and</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>auto_created\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_objects()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    f <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>one_to_many <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one<span class=\"p\">)</span>\n    <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created <span class=\"ow\">and</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>concrete\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_objects_with_model()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"p\">(</span>f<span class=\"o\">.</span>one_to_many <span class=\"ow\">or</span> f<span class=\"o\">.</span>one_to_one<span class=\"p\">)</span>\n    <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created <span class=\"ow\">and</span> <span class=\"ow\">not</span> f<span class=\"o\">.</span>concrete\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_many_to_many_objects()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    f <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">(</span>include_hidden<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>many_to_many <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_related_m2m_objects_with_model()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"p\">(</span>f<span class=\"p\">,</span> f<span class=\"o\">.</span>model <span class=\"k\">if</span> f<span class=\"o\">.</span>model <span class=\"o\">!=</span> MyModel <span class=\"k\">else</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">(</span>include_hidden<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> f<span class=\"o\">.</span>many_to_many <span class=\"ow\">and</span> f<span class=\"o\">.</span>auto_created\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">MyModel._meta.get_all_field_names()</code> becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">itertools</span> <span class=\"kn\">import</span> chain\n<span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"nb\">set</span><span class=\"p\">(</span>chain<span class=\"o\">.</span>from_iterable<span class=\"p\">(</span>\n    <span class=\"p\">(</span>field<span class=\"o\">.</span>name<span class=\"p\">,</span> field<span class=\"o\">.</span>attname<span class=\"p\">)</span> <span class=\"k\">if</span> <span class=\"nb\">hasattr</span><span class=\"p\">(</span>field<span class=\"p\">,</span> <span class=\"s1\">&#39;attname&#39;</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"p\">(</span>field<span class=\"o\">.</span>name<span class=\"p\">,)</span>\n    <span class=\"k\">for</span> field <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()</span>\n    <span class=\"c1\"># For complete backwards compatibility, you may want to exclude</span>\n    <span class=\"c1\"># GenericForeignKey from the results.</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"p\">(</span>field<span class=\"o\">.</span>many_to_one <span class=\"ow\">and</span> field<span class=\"o\">.</span>related_model <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"p\">)))</span>\n</code></pre></div>\n<p>This provides a 100% backwards compatible replacement, ensuring that both\nfield names and attribute names <code class=\"docutils literal notranslate\">ForeignKey</code>s are included, but fields\nassociated with <code class=\"docutils literal notranslate\">GenericForeignKey</code>s are not. A simpler version would be:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>f<span class=\"o\">.</span>name <span class=\"k\">for</span> f <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>_meta<span class=\"o\">.</span>get_fields<span class=\"p\">()]</span>\n</code></pre></div>\n<p>While this isn't 100% backwards compatible, it may be sufficient in many\nsituations.</p>\n</li>\n</ul>\n</section>","rootId":"module-django.db.models.options","toc":[{"title":"Field access API","anchor":"field-access-api","children":[{"title":"Retrieving a single field instance of a model by name","anchor":"retrieving-a-single-field-instance-of-a-model-by-name","children":[]},{"title":"Retrieving all field instances of a model","anchor":"retrieving-all-field-instances-of-a-model","children":[]}]},{"title":"Migrating from the old API","anchor":"migrating-from-the-old-api","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Acuan API","url":"/id/1.9/ref/"},{"docname":"ref/models/index","title":"Model","url":"/id/1.9/ref/models/"}],"prev":{"docname":"ref/models/fields","title":"Model field reference","url":"/id/1.9/ref/models/fields/"},"next":{"docname":"ref/models/relations","title":"Related objects reference","url":"/id/1.9/ref/models/relations/"},"formats":{"html":"/id/1.9/ref/models/meta/","markdown":"/id/1.9/ref/models/meta.md","json":"/id/1.9/ref/models/meta.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/ref/models/meta.txt","official":"https://docs.djangoproject.com/id/1.9/ref/models/meta/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","es"]}