{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/blog/how-to-fix-django-admin-timeouts",
    "result": {"data":{"markdownRemark":{"html":"<p>Have you ever noticed some Django admin page taking a long time to load? Maybe even ending in a timeout (http 504)?</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/c74d4b044e0f400550c829fe8ac8cc54/5a190/example.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 82.8125%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAABEklEQVQ4y72SXUvDMBSG8/9/kBfeqIjzYwoyUHSrRUTW2Qtt06bt+UqlTRtLXcfchQ8H8hLOm7wJR+V5rrUGgPrvKGOMiFhrRQQRiQgRmbmua9szaUZEp5jZGFP0VFVVlmXVIiLbzUVROGWt5R4R8cJu4ye2DznVOsK1NWZ/zO7nDfGd6vfWf5mHsaVn3zdnWebNaZpqrd3/7TUk4zC2RoJmOczMTIfc7OYJALAHAIho13h2EHmbEwDQnUQ0LmxKaa2TJElSbYqSaUw71bYrO9BtUjXoxCEAaJmW0efp0/ssWF8G0TyMzpfri9X6KtwczR+Pbx8UTgCIwhTGX7Mgugk3d68f92/x9YvT8clidbZ4/gaK9OfVeuHaRgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Example\"\n        title=\"Example\"\n        src=\"/static/c74d4b044e0f400550c829fe8ac8cc54/5a190/example.png\"\n        srcset=\"/static/c74d4b044e0f400550c829fe8ac8cc54/72799/example.png 320w,\n/static/c74d4b044e0f400550c829fe8ac8cc54/6af66/example.png 640w,\n/static/c74d4b044e0f400550c829fe8ac8cc54/5a190/example.png 800w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>This kind of issue should be uncommon in small, earlier projects. However, if it starts to happen and gets worse over time, one possible cause is that some of that entity’s relationships are editable on the page, which causes Django to fetch all instances in the database to populate the dropdown list.</p>\n<h3>Use <code class=\"language-text\">readonly_fields</code></h3>\n<p>In this situation, the easiest solution would be to just set those fields as <a href=\"https://docs.djangoproject.com/en/4.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"language-text\">readonly_fields</code></a> in the page definition.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CustomAdmin</span><span class=\"token punctuation\">(</span>admin<span class=\"token punctuation\">.</span>ModelAdmin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    readonly_fields <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token string\">\"some_field\"</span><span class=\"token punctuation\">,</span> <span class=\"token comment\"># ForeignKey with lots of instances</span>\n    <span class=\"token punctuation\">)</span></code></pre></div>\n<p>With it, the field will be rendered on the admin page just as its current value, statically.</p>\n<h2>Must be editable?</h2>\n<p>If having a foreign key as an editable field on the admin is a must for your use case, consider these options:</p>\n<h3>Use <code class=\"language-text\">raw_id_fields</code></h3>\n<p>Setting the field as a <a href=\"https://docs.djangoproject.com/en/4.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields\">raw id field</a> still allows its editing as just the id value of the related entity:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CustomAdmin</span><span class=\"token punctuation\">(</span>admin<span class=\"token punctuation\">.</span>ModelAdmin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    raw_id_fields <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token string\">\"some_field\"</span><span class=\"token punctuation\">,</span> <span class=\"token comment\"># ForeignKey with lots of instances</span>\n    <span class=\"token punctuation\">)</span></code></pre></div>\n<p>It will render an input field on the admin with the possibility of opening a popup to search for the desired instance</p>\n<h3>Use custom filters</h3>\n<p>Filtering a queryset to a smaller, more specific set of instances, like the example mentioned in <a href=\"https://code.djangoproject.com/ticket/28311\">Django ticket #28311</a> could also help speed up Admin pages:</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CustomForm</span><span class=\"token punctuation\">(</span>forms<span class=\"token punctuation\">.</span>ModelForm<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> <span class=\"token operator\">*</span>args<span class=\"token punctuation\">,</span> <span class=\"token operator\">**</span>kwargs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token builtin\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>__init__<span class=\"token punctuation\">(</span><span class=\"token operator\">*</span>args<span class=\"token punctuation\">,</span> <span class=\"token operator\">**</span>kwargs<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>fields<span class=\"token punctuation\">[</span><span class=\"token string\">\"some_field\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>queryset <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>_get_field_queryset<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">def</span> <span class=\"token function\">_get_field_queryset</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> SomeField<span class=\"token punctuation\">.</span>objects<span class=\"token punctuation\">.</span><span class=\"token builtin\">filter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">CustomAdmin</span><span class=\"token punctuation\">(</span>admin<span class=\"token punctuation\">.</span>ModelAdmin<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    form <span class=\"token operator\">=</span> CustomForm</code></pre></div>\n<p>In this case, you’d still have the editable field on admin as a dropdown, but with a smaller impact to its rendering performance.</p>","excerpt":"Have you ever noticed some Django admin page taking a long time to load? Maybe even ending in a timeout (http 504)?  This kind of issue should be uncommon in small, earlier projects. However, if it starts to happen and gets worse over time, one possible cause is that some of that entity’s relationships are editable on the page, which causes Django to fetch all instances in the database to populate the dropdown list. Use  In this situation, the easiest solution would be to just set those fields…","frontmatter":{"date":"November 02, 2022","path":"/blog/how-to-fix-django-admin-timeouts","title":"How to fix Django admin timeouts","comments":true,"author":"Luiz Lima"},"fields":{"readingTime":{"text":"2 min read"}}}},"pageContext":{}},
    "staticQueryHashes": ["63159454"]}