{"title":"Serializing Django objects","version":"2.1","locale":"el","docname":"topics/serialization","url":"/el/2.1/topics/serialization/","canonical":"https://djangodocs.dev/el/2.1/topics/serialization/","summary":"Django’s serialization framework provides a mechanism for «translating» Django models into other formats. Usually these other formats will be text-based and used…","html":"<h1>Serializing Django objects<a class=\"heading-anchor\" href=\"#serializing-django-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django’s serialization framework provides a mechanism for «translating» Django\nmodels into other formats. Usually these other formats will be text-based and\nused for sending Django data over a wire, but it’s possible for a\nserializer to handle any format (text-based or not).</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Δείτε επίσης</p>\n<p>If you just want to get some data from your tables into a serialized\nform, you could use the <a class=\"reference internal\" href=\"/el/2.1/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a> management command.</p>\n</aside>\n<section id=\"serializing-data\">\n<h2>Serializing data<a class=\"heading-anchor\" href=\"#serializing-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>At the highest level, serializing data is a very simple operation:</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=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">serializers</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s2\">&quot;xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">SomeModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>The arguments to the <code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code> function are the format to serialize the data\nto (see <a class=\"reference internal\" href=\"#id2\">Serialization formats</a>) and a\n<a class=\"reference internal\" href=\"/el/2.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> to serialize. (Actually, the second\nargument can be any iterator that yields Django model instances, but it’ll\nalmost always be a QuerySet).</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.serializers.get_serializer\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.serializers.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_serializer</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">format</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.serializers.get_serializer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>You can also use a serializer object directly:</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=\"n\">XMLSerializer</span> <span class=\"o\">=</span> <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">get_serializer</span><span class=\"p\">(</span><span class=\"s2\">&quot;xml&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">xml_serializer</span> <span class=\"o\">=</span> <span class=\"n\">XMLSerializer</span><span class=\"p\">()</span>\n<span class=\"n\">xml_serializer</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"n\">queryset</span><span class=\"p\">)</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">xml_serializer</span><span class=\"o\">.</span><span class=\"n\">getvalue</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>This is useful if you want to serialize data directly to a file-like object\n(which includes an <a class=\"reference internal\" href=\"/el/2.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>):</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=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;file.xml&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">out</span><span class=\"p\">:</span>\n    <span class=\"n\">xml_serializer</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"n\">SomeModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">(),</span> <span class=\"n\">stream</span><span class=\"o\">=</span><span class=\"n\">out</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Calling <a class=\"reference internal\" href=\"#django.core.serializers.get_serializer\" title=\"django.core.serializers.get_serializer\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_serializer()</span></code></a> with an unknown\n<a class=\"reference internal\" href=\"#serialization-formats\"><span class=\"std std-ref\">format</span></a> will raise a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.serializers.SerializerDoesNotExist</span></code> exception.</p>\n</aside>\n<section id=\"subset-of-fields\">\n<span id=\"id1\"></span><h3>Subset of fields<a class=\"heading-anchor\" href=\"#subset-of-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you only want a subset of fields to be serialized, you can\nspecify a <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> argument to the serializer:</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=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">serializers</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s1\">&#39;xml&#39;</span><span class=\"p\">,</span> <span class=\"n\">SomeModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">(),</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span><span class=\"s1\">&#39;size&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>In this example, only the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">size</span></code> attributes of each model will\nbe serialized. The primary key is always serialized as the <code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code> element in the\nresulting output; it never appears in the <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> part.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Depending on your model, you may find that it is not possible to\ndeserialize a model that only serializes a subset of its fields. If a\nserialized object doesn’t specify all the fields that are required by a\nmodel, the deserializer will not be able to save deserialized instances.</p>\n</aside>\n</section>\n<section id=\"inherited-models\">\n<h3>Inherited models<a class=\"heading-anchor\" href=\"#inherited-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you have a model that is defined using an <a class=\"reference internal\" href=\"/el/2.1/topics/db/models/#abstract-base-classes\"><span class=\"std std-ref\">abstract base class</span></a>, you don’t have to do anything special to serialize\nthat model. Just call the serializer on the object (or objects) that you want to\nserialize, and the output will be a complete representation of the serialized\nobject.</p>\n<p>However, if you have a model that uses <a class=\"reference internal\" href=\"/el/2.1/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">multi-table inheritance</span></a>, you also need to serialize all of the base classes\nfor the model. This is because only the fields that are locally defined on the\nmodel will be serialized. For example, consider the following models:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Place</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Restaurant</span><span class=\"p\">(</span><span class=\"n\">Place</span><span class=\"p\">):</span>\n    <span class=\"n\">serves_hot_dogs</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>If you only serialize the Restaurant model:</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=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s1\">&#39;xml&#39;</span><span class=\"p\">,</span> <span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>the fields on the serialized output will only contain the <code class=\"docutils literal notranslate\"><span class=\"pre\">serves_hot_dogs</span></code>\nattribute. The <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> attribute of the base class will be ignored.</p>\n<p>In order to fully serialize your <code class=\"docutils literal notranslate\"><span class=\"pre\">Restaurant</span></code> instances, you will need to\nserialize the <code class=\"docutils literal notranslate\"><span class=\"pre\">Place</span></code> models as well:</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=\"n\">all_objects</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span> <span class=\"o\">+</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">Place</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n<span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s1\">&#39;xml&#39;</span><span class=\"p\">,</span> <span class=\"n\">all_objects</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"deserializing-data\">\n<h2>Deserializing data<a class=\"heading-anchor\" href=\"#deserializing-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Deserializing data is also a fairly simple operation:</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=\"k\">for</span> <span class=\"n\">obj</span> <span class=\"ow\">in</span> <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">deserialize</span><span class=\"p\">(</span><span class=\"s2\">&quot;xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">):</span>\n    <span class=\"n\">do_something_with</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>As you can see, the <code class=\"docutils literal notranslate\"><span class=\"pre\">deserialize</span></code> function takes the same format argument as\n<code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code>, a string or stream of data, and returns an iterator.</p>\n<p>However, here it gets slightly complicated. The objects returned by the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">deserialize</span></code> iterator <em>aren’t</em> simple Django objects. Instead, they are\nspecial <code class=\"docutils literal notranslate\"><span class=\"pre\">DeserializedObject</span></code> instances that wrap a created – but unsaved –\nobject and any associated relationship data.</p>\n<p>Calling <code class=\"docutils literal notranslate\"><span class=\"pre\">DeserializedObject.save()</span></code> saves the object to the database.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>If the <code class=\"docutils literal notranslate\"><span class=\"pre\">pk</span></code> attribute in the serialized data doesn’t exist or is\nnull, a new instance will be saved to the database.</p>\n</aside>\n<p>This ensures that deserializing is a non-destructive operation even if the\ndata in your serialized representation doesn’t match what’s currently in the\ndatabase. Usually, working with these <code class=\"docutils literal notranslate\"><span class=\"pre\">DeserializedObject</span></code> instances looks\nsomething like:</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=\"k\">for</span> <span class=\"n\">deserialized_object</span> <span class=\"ow\">in</span> <span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">deserialize</span><span class=\"p\">(</span><span class=\"s2\">&quot;xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">object_should_be_saved</span><span class=\"p\">(</span><span class=\"n\">deserialized_object</span><span class=\"p\">):</span>\n        <span class=\"n\">deserialized_object</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>In other words, the usual use is to examine the deserialized objects to make\nsure that they are «appropriate» for saving before doing so.  Of course, if you\ntrust your data source you could just save the object and move on.</p>\n<p>The Django object itself can be inspected as <code class=\"docutils literal notranslate\"><span class=\"pre\">deserialized_object.object</span></code>.\nIf fields in the serialized data do not exist on a model, a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">DeserializationError</span></code> will be raised unless the <code class=\"docutils literal notranslate\"><span class=\"pre\">ignorenonexistent</span></code>\nargument is passed in as <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>:</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=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">deserialize</span><span class=\"p\">(</span><span class=\"s2\">&quot;xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">ignorenonexistent</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"serialization-formats\">\n<span id=\"id2\"></span><h2>Serialization formats<a class=\"heading-anchor\" href=\"#serialization-formats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django supports a number of serialization formats, some of which require you\nto install third-party Python modules:</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>Identifier</p></th>\n<th class=\"head\"><p>Information</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">xml</span></code></p></td>\n<td><p>Serializes to and from a simple XML dialect.</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">json</span></code></p></td>\n<td><p>Serializes to and from <a class=\"reference external\" href=\"https://json.org/\">JSON</a>.</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">yaml</span></code></p></td>\n<td><p>Serializes to YAML (YAML Ain’t a Markup Language). This\nserializer is only available if <a class=\"reference external\" href=\"https://pyyaml.org/\">PyYAML</a> is installed.</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<section id=\"xml\">\n<h3>XML<a class=\"heading-anchor\" href=\"#xml\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The basic XML serialization format is quite simple:</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>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;django-objects version=&quot;1.0&quot;&gt;\n    &lt;object pk=&quot;123&quot; model=&quot;sessions.session&quot;&gt;\n        &lt;field type=&quot;DateTimeField&quot; name=&quot;expire_date&quot;&gt;2013-01-16T08:16:59.844560+00:00&lt;/field&gt;\n        &lt;!-- ... --&gt;\n    &lt;/object&gt;\n&lt;/django-objects&gt;\n</code></pre></div>\n<p>The whole collection of objects that is either serialized or deserialized is\nrepresented by a <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;django-objects&gt;</span></code>-tag which contains multiple\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;object&gt;</span></code>-elements. Each such object has two attributes: «pk» and «model»,\nthe latter being represented by the name of the app («sessions») and the\nlowercase name of the model («session») separated by a dot.</p>\n<p>Each field of the object is serialized as a <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;</span></code>-element sporting the\nfields «type» and «name». The text content of the element represents the value\nthat should be stored.</p>\n<p>Foreign keys and other relational fields are treated a little bit differently:</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>&lt;object pk=&quot;27&quot; model=&quot;auth.permission&quot;&gt;\n    &lt;!-- ... --&gt;\n    &lt;field to=&quot;contenttypes.contenttype&quot; name=&quot;content_type&quot; rel=&quot;ManyToOneRel&quot;&gt;9&lt;/field&gt;\n    &lt;!-- ... --&gt;\n&lt;/object&gt;\n</code></pre></div>\n<p>In this example we specify that the <code class=\"docutils literal notranslate\"><span class=\"pre\">auth.Permission</span></code> object with the PK 27\nhas a foreign key to the <code class=\"docutils literal notranslate\"><span class=\"pre\">contenttypes.ContentType</span></code> instance with the PK 9.</p>\n<p>ManyToMany-relations are exported for the model that binds them. For instance,\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">auth.User</span></code> model has such a relation to the <code class=\"docutils literal notranslate\"><span class=\"pre\">auth.Permission</span></code> model:</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>&lt;object pk=&quot;1&quot; model=&quot;auth.user&quot;&gt;\n    &lt;!-- ... --&gt;\n    &lt;field to=&quot;auth.permission&quot; name=&quot;user_permissions&quot; rel=&quot;ManyToManyRel&quot;&gt;\n        &lt;object pk=&quot;46&quot;&gt;&lt;/object&gt;\n        &lt;object pk=&quot;47&quot;&gt;&lt;/object&gt;\n    &lt;/field&gt;\n&lt;/object&gt;\n</code></pre></div>\n<p>This example links the given user with the permission models with PKs 46 and 47.</p>\n<aside class=\"admonition-control-characters admonition\">\n<p class=\"admonition-title\">Control characters</p>\n<p>If the content to be serialized contains control characters that are not\naccepted in the XML 1.0 standard, the serialization will fail with a\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></a> exception. Read also the W3C’s explanation of <a class=\"reference external\" href=\"https://www.w3.org/International/questions/qa-controls\">HTML,\nXHTML, XML and Control Codes</a>.</p>\n</aside>\n</section>\n<section id=\"serialization-formats-json\">\n<span id=\"id3\"></span><h3>JSON<a class=\"heading-anchor\" href=\"#serialization-formats-json\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When staying with the same example data as before it would be serialized as\nJSON in the following way:</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>\n        <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;4b678b301dfd8a4e0dad910de3ae245b&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;sessions.session&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;expire_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;2013-01-16T08:16:59.844Z&quot;</span><span class=\"p\">,</span>\n            <span class=\"o\">...</span>\n        <span class=\"p\">}</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>The formatting here is a bit simpler than with XML. The whole collection\nis just represented as an array and the objects are represented by JSON objects\nwith three properties: «pk», «model» and «fields». «fields» is again an object\ncontaining each field’s name and value as property and property-value\nrespectively.</p>\n<p>Foreign keys just have the PK of the linked object as property value.\nManyToMany-relations are serialized for the model that defines them and are\nrepresented as a list of PKs.</p>\n<p>Be aware that not all Django output can be passed unmodified to <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#module-json\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">json</span></code></a>.\nFor example, if you have some custom type in an object to be serialized, you’ll\nhave to write a custom <a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#module-json\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">json</span></code></a> encoder for it. Something like this will\nwork:</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=\"w\"> </span><span class=\"nn\">django.core.serializers.json</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">DjangoJSONEncoder</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">LazyEncoder</span><span class=\"p\">(</span><span class=\"n\">DjangoJSONEncoder</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">default</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">YourCustomType</span><span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">default</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>You can then pass <code class=\"docutils literal notranslate\"><span class=\"pre\">cls=LazyEncoder</span></code> to the <code class=\"docutils literal notranslate\"><span class=\"pre\">serializers.serialize()</span></code>\nfunction:</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=\"w\"> </span><span class=\"nn\">django.core.serializers</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">serialize</span>\n\n<span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s1\">&#39;json&#39;</span><span class=\"p\">,</span> <span class=\"n\">SomeModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">(),</span> <span class=\"bp\">cls</span><span class=\"o\">=</span><span class=\"n\">LazyEncoder</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Also note that GeoDjango provides a <a class=\"reference internal\" href=\"/el/2.1/ref/contrib/gis/serializers/\"><span class=\"doc\">customized GeoJSON serializer</span></a>.</p>\n<section id=\"djangojsonencoder\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoJSONEncoder</span></code><a class=\"heading-anchor\" href=\"#djangojsonencoder\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.serializers.json.DjangoJSONEncoder\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.serializers.json.</span></span><span class=\"sig-name descname\"><span class=\"pre\">DjangoJSONEncoder</span></span><a class=\"heading-anchor\" href=\"#django.core.serializers.json.DjangoJSONEncoder\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>The JSON serializer uses <code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoJSONEncoder</span></code> for encoding. A subclass of\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/json.html#json.JSONEncoder\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONEncoder</span></code></a>, it handles these additional types:</p>\n<dl class=\"simple\">\n<dt><a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a></dt><dd><p>A string of the form <code class=\"docutils literal notranslate\"><span class=\"pre\">YYYY-MM-DDTHH:mm:ss.sssZ</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">YYYY-MM-DDTHH:mm:ss.sss+HH:MM</span></code> as defined in <a class=\"reference external\" href=\"https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15\">ECMA-262</a>.</p>\n</dd>\n<dt><a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">date</span></code></a></dt><dd><p>A string of the form <code class=\"docutils literal notranslate\"><span class=\"pre\">YYYY-MM-DD</span></code> as defined in <a class=\"reference external\" href=\"https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15\">ECMA-262</a>.</p>\n</dd>\n<dt><a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.time\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">time</span></code></a></dt><dd><p>A string of the form <code class=\"docutils literal notranslate\"><span class=\"pre\">HH:MM:ss.sss</span></code> as defined in <a class=\"reference external\" href=\"https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15\">ECMA-262</a>.</p>\n</dd>\n<dt><a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.timedelta\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">timedelta</span></code></a></dt><dd><p>A string representing a duration as defined in ISO-8601. For example,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">timedelta(days=1,</span> <span class=\"pre\">hours=2,</span> <span class=\"pre\">seconds=3.4)</span></code> is represented as\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'P1DT02H00M03.400000S'</span></code>.</p>\n</dd>\n<dt><a class=\"reference external\" href=\"https://docs.python.org/3/library/decimal.html#decimal.Decimal\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Decimal</span></code></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">Promise</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.functional.lazy()</span></code> objects), <a class=\"reference external\" href=\"https://docs.python.org/3/library/uuid.html#uuid.UUID\" title=\"(στη Python έκδοση 3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UUID</span></code></a></dt><dd><p>A string representation of the object.</p>\n</dd>\n</dl>\n</section>\n</section>\n<section id=\"yaml\">\n<h3>YAML<a class=\"heading-anchor\" href=\"#yaml\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>YAML serialization looks quite similar to JSON. The object list is serialized\nas a sequence mappings with the keys «pk», «model» and «fields». Each field is\nagain a mapping with the key being name of the field and the value the value:</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>-   fields: {expire_date: !!timestamp &#39;2013-01-16 08:16:59.844560+00:00&#39;}\n    model: sessions.session\n    pk: 4b678b301dfd8a4e0dad910de3ae245b\n</code></pre></div>\n<p>Referential fields are again just represented by the PK or sequence of PKs.</p>\n</section>\n</section>\n<section id=\"natural-keys\">\n<span id=\"topics-serialization-natural-keys\"></span><h2>Natural keys<a class=\"heading-anchor\" href=\"#natural-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The default serialization strategy for foreign keys and many-to-many relations\nis to serialize the value of the primary key(s) of the objects in the relation.\nThis strategy works well for most objects, but it can cause difficulty in some\ncircumstances.</p>\n<p>Consider the case of a list of objects that have a foreign key referencing\n<a class=\"reference internal\" href=\"/el/2.1/ref/contrib/contenttypes/#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentType</span></code></a>. If you’re going to\nserialize an object that refers to a content type, then you need to have a way\nto refer to that content type to begin with. Since <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code> objects are\nautomatically created by Django during the database synchronization process,\nthe primary key of a given content type isn’t easy to predict; it will\ndepend on how and when <a class=\"reference internal\" href=\"/el/2.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> was executed. This is true for all\nmodels which automatically generate objects, notably including\n<a class=\"reference internal\" href=\"/el/2.1/ref/contrib/auth/#id3\" title=\"django.contrib.auth.models.Permission\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Permission</span></code></a>,\n<a class=\"reference internal\" href=\"/el/2.1/ref/contrib/auth/#id6\" title=\"django.contrib.auth.models.Group\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Group</span></code></a>, and\n<a class=\"reference internal\" href=\"/el/2.1/ref/contrib/auth/#id1\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Προειδοποίηση</p>\n<p>You should never include automatically generated objects in a fixture or\nother serialized data. By chance, the primary keys in the fixture\nmay match those in the database and loading the fixture will\nhave no effect. In the more likely case that they don’t match, the fixture\nloading will fail with an <a class=\"reference internal\" href=\"/el/2.1/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a>.</p>\n</aside>\n<p>There is also the matter of convenience. An integer id isn’t always\nthe most convenient way to refer to an object; sometimes, a\nmore natural reference would be helpful.</p>\n<p>It is for these reasons that Django provides <em>natural keys</em>. A natural\nkey is a tuple of values that can be used to uniquely identify an\nobject instance without using the primary key value.</p>\n<section id=\"deserialization-of-natural-keys\">\n<h3>Deserialization of natural keys<a class=\"heading-anchor\" href=\"#deserialization-of-natural-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Consider the following two models:</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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n    <span class=\"n\">birthdate</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">unique_together</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">),)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ordinarily, serialized data for <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> would use an integer to refer to\nthe author. For example, in JSON, a Book might be serialized as:</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=\"o\">...</span>\n<span class=\"p\">{</span>\n    <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;store.book&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Mostly Harmless&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;author&quot;</span><span class=\"p\">:</span> <span class=\"mi\">42</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n<span class=\"o\">...</span>\n</code></pre></div>\n<p>This isn’t a particularly natural way to refer to an author. It\nrequires that you know the primary key value for the author; it also\nrequires that this primary key value is stable and predictable.</p>\n<p>However, if we add natural key handling to Person, the fixture becomes\nmuch more humane. To add natural key handling, you define a default\nManager for Person with a <code class=\"docutils literal notranslate\"><span class=\"pre\">get_by_natural_key()</span></code> method. In the case\nof a Person, a good natural key might be the pair of first and last\nname:</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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonManager</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_by_natural_key</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">first_name</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"n\">first_name</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"n\">last_name</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">PersonManager</span><span class=\"p\">()</span>\n\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n    <span class=\"n\">birthdate</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">unique_together</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">),)</span>\n</code></pre></div>\n<p>Now books can use that natural key to refer to <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> objects:</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=\"o\">...</span>\n<span class=\"p\">{</span>\n    <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;store.book&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Mostly Harmless&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;author&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Douglas&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Adams&quot;</span><span class=\"p\">]</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n<span class=\"o\">...</span>\n</code></pre></div>\n<p>When you try to load this serialized data, Django will use the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_by_natural_key()</span></code> method to resolve <code class=\"docutils literal notranslate\"><span class=\"pre\">[&quot;Douglas&quot;,</span> <span class=\"pre\">&quot;Adams&quot;]</span></code>\ninto the primary key of an actual <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> object.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Whatever fields you use for a natural key must be able to uniquely\nidentify an object. This will usually mean that your model will\nhave a uniqueness clause (either unique=True on a single field, or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> over multiple fields) for the field or fields\nin your natural key. However, uniqueness doesn’t need to be\nenforced at the database level. If you are certain that a set of\nfields will be effectively unique, you can still use those fields\nas a natural key.</p>\n</aside>\n<p>Deserialization of objects with no primary key will always check whether the\nmodel’s manager has a <code class=\"docutils literal notranslate\"><span class=\"pre\">get_by_natural_key()</span></code> method and if so, use it to\npopulate the deserialized object’s primary key.</p>\n</section>\n<section id=\"serialization-of-natural-keys\">\n<h3>Serialization of natural keys<a class=\"heading-anchor\" href=\"#serialization-of-natural-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>So how do you get Django to emit a natural key when serializing an object?\nFirstly, you need to add another method – this time to the model itself:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">PersonManager</span><span class=\"p\">()</span>\n\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n    <span class=\"n\">birthdate</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">natural_key</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">first_name</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">last_name</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">unique_together</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">),)</span>\n</code></pre></div>\n<p>That method should always return a natural key tuple – in this\nexample, <code class=\"docutils literal notranslate\"><span class=\"pre\">(first</span> <span class=\"pre\">name,</span> <span class=\"pre\">last</span> <span class=\"pre\">name)</span></code>. Then, when you call\n<code class=\"docutils literal notranslate\"><span class=\"pre\">serializers.serialize()</span></code>, you provide <code class=\"docutils literal notranslate\"><span class=\"pre\">use_natural_foreign_keys=True</span></code>\nor <code class=\"docutils literal notranslate\"><span class=\"pre\">use_natural_primary_keys=True</span></code> arguments:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">serialize</span><span class=\"p\">(</span><span class=\"s1\">&#39;json&#39;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">book1</span><span class=\"p\">,</span> <span class=\"n\">book2</span><span class=\"p\">],</span> <span class=\"n\">indent</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>     <span class=\"n\">use_natural_foreign_keys</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">use_natural_primary_keys</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>When <code class=\"docutils literal notranslate\"><span class=\"pre\">use_natural_foreign_keys=True</span></code> is specified, Django will use the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">natural_key()</span></code> method to serialize any foreign key reference to objects\nof the type that defines the method.</p>\n<p>When <code class=\"docutils literal notranslate\"><span class=\"pre\">use_natural_primary_keys=True</span></code> is specified, Django will not provide the\nprimary key in the serialized data of this object since it can be calculated\nduring deserialization:</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=\"o\">...</span>\n<span class=\"p\">{</span>\n    <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;store.person&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Douglas&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Adams&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1952-03-11&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n<span class=\"o\">...</span>\n</code></pre></div>\n<p>This can be useful when you need to load serialized data into an existing\ndatabase and you cannot guarantee that the serialized primary key value is not\nalready in use, and do not need to ensure that deserialized objects retain the\nsame primary keys.</p>\n<p>If you are using <a class=\"reference internal\" href=\"/el/2.1/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a> to generate serialized data, use the\n<a class=\"reference internal\" href=\"/el/2.1/ref/django-admin/#cmdoption-dumpdata-natural-foreign\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">dumpdata</span> <span class=\"pre\">--natural-foreign</span></code></a> and <a class=\"reference internal\" href=\"/el/2.1/ref/django-admin/#cmdoption-dumpdata-natural-primary\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">dumpdata</span> <span class=\"pre\">--natural-primary</span></code></a>\ncommand line flags to generate natural keys.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>You don’t need to define both <code class=\"docutils literal notranslate\"><span class=\"pre\">natural_key()</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_by_natural_key()</span></code>. If you don’t want Django to output\nnatural keys during serialization, but you want to retain the\nability to load natural keys, then you can opt to not implement\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">natural_key()</span></code> method.</p>\n<p>Conversely, if (for some strange reason) you want Django to output\nnatural keys during serialization, but <em>not</em> be able to load those\nkey values, just don’t define the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_by_natural_key()</span></code> method.</p>\n</aside>\n</section>\n<section id=\"dependencies-during-serialization\">\n<h3>Dependencies during serialization<a class=\"heading-anchor\" href=\"#dependencies-during-serialization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Since natural keys rely on database lookups to resolve references, it\nis important that the data exists before it is referenced. You can’t make\na «forward reference» with natural keys – the data you’re referencing\nmust exist before you include a natural key reference to that data.</p>\n<p>To accommodate this limitation, calls to <a class=\"reference internal\" href=\"/el/2.1/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a> that use\nthe <a class=\"reference internal\" href=\"/el/2.1/ref/django-admin/#cmdoption-dumpdata-natural-foreign\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">dumpdata</span> <span class=\"pre\">--natural-foreign</span></code></a> option will serialize any model with a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">natural_key()</span></code> method before serializing standard primary key objects.</p>\n<p>However, this may not always be enough. If your natural key refers to\nanother object (by using a foreign key or natural key to another object\nas part of a natural key), then you need to be able to ensure that\nthe objects on which a natural key depends occur in the serialized data\nbefore the natural key requires them.</p>\n<p>To control this ordering, you can define dependencies on your\n<code class=\"docutils literal notranslate\"><span class=\"pre\">natural_key()</span></code> methods. You do this by setting a <code class=\"docutils literal notranslate\"><span class=\"pre\">dependencies</span></code>\nattribute on the <code class=\"docutils literal notranslate\"><span class=\"pre\">natural_key()</span></code> method itself.</p>\n<p>For example, let’s add a natural key to the <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> model from the\nexample above:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">natural_key</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">natural_key</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>The natural key for a <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> is a combination of its name and its\nauthor. This means that <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> must be serialized before <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code>.\nTo define this dependency, we add one extra line:</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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">natural_key</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,)</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">author</span><span class=\"o\">.</span><span class=\"n\">natural_key</span><span class=\"p\">()</span>\n<span class=\"n\">natural_key</span><span class=\"o\">.</span><span class=\"n\">dependencies</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s1\">&#39;example_app.person&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>This definition ensures that all <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> objects are serialized before\nany <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> objects. In turn, any object referencing <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> will be\nserialized after both <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">Book</span></code> have been serialized.</p>\n</section>\n</section>","rootId":"serializing-django-objects","toc":[{"title":"Serializing data","anchor":"serializing-data","children":[{"title":"Subset of fields","anchor":"subset-of-fields","children":[]},{"title":"Inherited models","anchor":"inherited-models","children":[]}]},{"title":"Deserializing data","anchor":"deserializing-data","children":[]},{"title":"Serialization formats","anchor":"serialization-formats","children":[{"title":"XML","anchor":"xml","children":[]},{"title":"JSON","anchor":"serialization-formats-json","children":[{"title":"DjangoJSONEncoder","anchor":"djangojsonencoder","children":[]}]},{"title":"YAML","anchor":"yaml","children":[]}]},{"title":"Natural keys","anchor":"natural-keys","children":[{"title":"Deserialization of natural keys","anchor":"deserialization-of-natural-keys","children":[]},{"title":"Serialization of natural keys","anchor":"serialization-of-natural-keys","children":[]},{"title":"Dependencies during serialization","anchor":"dependencies-during-serialization","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Using Django","url":"/el/2.1/topics/"}],"prev":{"docname":"topics/performance","title":"Performance and optimization","url":"/el/2.1/topics/performance/"},"next":{"docname":"topics/settings","title":"Django settings","url":"/el/2.1/topics/settings/"},"formats":{"html":"/el/2.1/topics/serialization/","markdown":"/el/2.1/topics/serialization.md","json":"/el/2.1/topics/serialization.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/topics/serialization.txt","official":"https://docs.djangoproject.com/el/2.1/topics/serialization/","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"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}