 <p>It's a bit of a mystery, isn't it? Several superficially plausible theories turn out to be wrong on investigation:</p> <ol> <li><p>So that the <code>POST</code> object doesn't have to implement mutation methods? No: the <code>POST</code> object belongs to the <a href="https://github.com/django/django/blob/master/django/http/__init__.py#L371"><code>django.http.QueryDict</code> class</a>, which implements a full set of mutation methods including <code>__setitem__</code>, <code>__delitem__</code>, <code>pop</code> and <code>clear</code>. It implements immutability by checking a flag when you call one of the mutation methods. And when you call the <code>copy</code> method you get another <code>QueryDict</code> instance with the mutable flag turned on.</p></li> <li><p>For performance improvement? No: the <code>QueryDict</code> class gains no performance benefit when the mutable flag is turned off.</p></li> <li><p>So that the <code>POST</code> object can be used as a dictionary key? No: <code>QueryDict</code> objects are not hashable.</p></li> <li><p>So that the <code>POST</code> data can be built lazily (without committing to read the whole response), <a href="http://stackoverflow.com/questions/2339857/why-is-post-data-copied-in-django#comment2312894_2339963">as claimed here</a>? I see no evidence of this in the code: as far as I can tell, the whole of the response is always read, either <a href="https://github.com/django/django/blob/master/django/http/__init__.py#L296">directly</a>, or via <a href="https://github.com/django/django/blob/master/django/http/multipartparser.py#L35"><code>MultiPartParser</code></a> for <code>multipart</code> responses.</p></li> <li><p>To protect you against programming errors? I've seen this claimed, but I've never seen a good explanation of what these errors are, and how immutability protects you against them.</p></li> </ol> <p>In any case, <code>POST</code> is <em>not always immutable</em>: when the response is <code>multipart</code>, then <code>POST</code> is mutable. This seems to put the kibosh on most theories you might think of. (Unless this behaviour is an oversight.)</p> <p>In summary, <strong>I can see no clear rationale</strong> in Django for the <code>POST</code> object to be immutable for non-<code>multipart</code> requests.</p>