{"title":"Serializing Django objects","version":"5.2","locale":"ko","docname":"topics/serialization","url":"/ko/5.2/topics/serialization/","canonical":"https://djangodocs.dev/ko/5.2/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=\"/ko/5.2/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, you can serialize data like this:</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\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;json&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=\"/ko/5.2/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\">JSONSerializer</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;json&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">json_serializer</span> <span class=\"o\">=</span> <span class=\"n\">JSONSerializer</span><span class=\"p\">()</span>\n<span class=\"n\">json_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\">json_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=\"/ko/5.2/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.json&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\">json_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\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;json&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> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;size&quot;</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=\"/ko/5.2/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. 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=\"/ko/5.2/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\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=\"s2\">&quot;json&quot;</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=\"p\">[</span><span class=\"o\">*</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=\"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=\"s2\">&quot;json&quot;</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 very similar to serializing it:</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;json&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> regular 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;json&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. If you trust your\ndata source you can instead save the object directly 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;json&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\">jsonl</span></code></p></td>\n<td><p>Serializes to and from <a class=\"reference external\" href=\"https://jsonlines.org/\">JSONL</a>.</p></td>\n</tr>\n<tr class=\"row-odd\"><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<span id=\"serialization-formats-xml\"></span><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 looks like this:</p>\n<div class=\"code-block\" data-language=\"xml\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">XML</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=\"XML code\"><code><span class=\"cp\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</span>\n<span class=\"nt\">&lt;django-objects</span><span class=\"w\"> </span><span class=\"na\">version=</span><span class=\"s\">&quot;1.0&quot;</span><span class=\"nt\">&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;object</span><span class=\"w\"> </span><span class=\"na\">pk=</span><span class=\"s\">&quot;123&quot;</span><span class=\"w\"> </span><span class=\"na\">model=</span><span class=\"s\">&quot;sessions.session&quot;</span><span class=\"nt\">&gt;</span>\n<span class=\"w\">        </span><span class=\"nt\">&lt;field</span><span class=\"w\"> </span><span class=\"na\">type=</span><span class=\"s\">&quot;DateTimeField&quot;</span><span class=\"w\"> </span><span class=\"na\">name=</span><span class=\"s\">&quot;expire_date&quot;</span><span class=\"nt\">&gt;</span>2013-01-16T08:16:59.844560+00:00<span class=\"nt\">&lt;/field&gt;</span>\n<span class=\"w\">        </span><span class=\"cm\">&lt;!-- ... --&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;/object&gt;</span>\n<span class=\"nt\">&lt;/django-objects&gt;</span>\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=\"xml\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">XML</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=\"XML code\"><code><span class=\"nt\">&lt;object</span><span class=\"w\"> </span><span class=\"na\">pk=</span><span class=\"s\">&quot;27&quot;</span><span class=\"w\"> </span><span class=\"na\">model=</span><span class=\"s\">&quot;auth.permission&quot;</span><span class=\"nt\">&gt;</span>\n<span class=\"w\">    </span><span class=\"cm\">&lt;!-- ... --&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;field</span><span class=\"w\"> </span><span class=\"na\">to=</span><span class=\"s\">&quot;contenttypes.contenttype&quot;</span><span class=\"w\"> </span><span class=\"na\">name=</span><span class=\"s\">&quot;content_type&quot;</span><span class=\"w\"> </span><span class=\"na\">rel=</span><span class=\"s\">&quot;ManyToOneRel&quot;</span><span class=\"nt\">&gt;</span>9<span class=\"nt\">&lt;/field&gt;</span>\n<span class=\"w\">    </span><span class=\"cm\">&lt;!-- ... --&gt;</span>\n<span class=\"nt\">&lt;/object&gt;</span>\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=\"xml\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">XML</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=\"XML code\"><code><span class=\"nt\">&lt;object</span><span class=\"w\"> </span><span class=\"na\">pk=</span><span class=\"s\">&quot;1&quot;</span><span class=\"w\"> </span><span class=\"na\">model=</span><span class=\"s\">&quot;auth.user&quot;</span><span class=\"nt\">&gt;</span>\n<span class=\"w\">    </span><span class=\"cm\">&lt;!-- ... --&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;field</span><span class=\"w\"> </span><span class=\"na\">to=</span><span class=\"s\">&quot;auth.permission&quot;</span><span class=\"w\"> </span><span class=\"na\">name=</span><span class=\"s\">&quot;user_permissions&quot;</span><span class=\"w\"> </span><span class=\"na\">rel=</span><span class=\"s\">&quot;ManyToManyRel&quot;</span><span class=\"nt\">&gt;</span>\n<span class=\"w\">        </span><span class=\"nt\">&lt;object</span><span class=\"w\"> </span><span class=\"na\">pk=</span><span class=\"s\">&quot;46&quot;</span><span class=\"nt\">&gt;&lt;/object&gt;</span>\n<span class=\"w\">        </span><span class=\"nt\">&lt;object</span><span class=\"w\"> </span><span class=\"na\">pk=</span><span class=\"s\">&quot;47&quot;</span><span class=\"nt\">&gt;&lt;/object&gt;</span>\n<span class=\"w\">    </span><span class=\"nt\">&lt;/field&gt;</span>\n<span class=\"nt\">&lt;/object&gt;</span>\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 v3.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=\"c1\"># ...</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 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 v3.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 v3.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\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=\"s2\">&quot;json&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> <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=\"/ko/5.2/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 v3.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 v3.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://262.ecma-international.org/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 v3.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://262.ecma-international.org/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 v3.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://262.ecma-international.org/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 v3.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 v3.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 v3.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=\"serialization-formats-jsonl\">\n<span id=\"id4\"></span><h3>JSONL<a class=\"heading-anchor\" href=\"#serialization-formats-jsonl\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><em>JSONL</em> stands for <em>JSON Lines</em>. With this format, objects are separated by new\nlines, and each line contains a valid JSON object. JSONL serialized data looks\nlike this:</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><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;4b678b301dfd8a4e0dad910de3ae245b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;sessions.session&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">}}</span>\n<span class=\"p\">{</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;88bea72c02274f3c9bf1cb2bb8cee4fc&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;sessions.session&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">}}</span>\n<span class=\"p\">{</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;9cf0e26691b64147a67e2a9f06ad7a53&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;sessions.session&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">}}</span>\n</code></pre></div>\n<p>JSONL can be useful for populating large databases, since the data can be\nprocessed line by line, rather than being loaded into memory all at once.</p>\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=\"yaml\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">YAML</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=\"YAML code\"><code><span class=\"p p-Indicator\">-</span><span class=\"w\"> </span><span class=\"nt\">model</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"l l-Scalar l-Scalar-Plain\">sessions.session</span>\n<span class=\"w\">  </span><span class=\"nt\">pk</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"l l-Scalar l-Scalar-Plain\">4b678b301dfd8a4e0dad910de3ae245b</span>\n<span class=\"w\">  </span><span class=\"nt\">fields</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"nt\">expire_date</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"l l-Scalar l-Scalar-Plain\">2013-01-16 08:16:59.844560+00:00</span>\n</code></pre></div>\n<p>Referential fields are again represented by the PK or sequence of PKs.</p>\n</section>\n<section id=\"custom-serialization-formats\">\n<span id=\"id5\"></span><h3>Custom serialization formats<a class=\"heading-anchor\" href=\"#custom-serialization-formats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>In addition to the default formats, you can create a custom serialization\nformat.</p>\n<p>For example, let’s consider a csv serializer and deserializer. First, define a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Serializer</span></code> and a <code class=\"docutils literal notranslate\"><span class=\"pre\">Deserializer</span></code> class. These can override existing\nserialization format classes:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">path/to/custom_csv_serializer.py</span></code></figcaption>\n<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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">csv</span>\n\n <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">apps</span>\n <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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.serializers.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">DeserializationError</span>\n\n\n <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Serializer</span><span class=\"p\">(</span><span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">python</span><span class=\"o\">.</span><span class=\"n\">Serializer</span><span class=\"p\">):</span>\n     <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_dump_object</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=\"n\">dumped_object</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_dump_object</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n         <span class=\"n\">row</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">dumped_object</span><span class=\"p\">[</span><span class=\"s2\">&quot;model&quot;</span><span class=\"p\">],</span> <span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">dumped_object</span><span class=\"p\">[</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">])]</span>\n         <span class=\"n\">row</span> <span class=\"o\">+=</span> <span class=\"p\">[</span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">dumped_object</span><span class=\"p\">[</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()]</span>\n         <span class=\"k\">return</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">row</span><span class=\"p\">),</span> <span class=\"n\">dumped_object</span><span class=\"p\">[</span><span class=\"s2\">&quot;model&quot;</span><span class=\"p\">]</span>\n\n     <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">end_object</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=\"n\">dumped_object_str</span><span class=\"p\">,</span> <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_dump_object</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n         <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">first</span><span class=\"p\">:</span>\n             <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">field</span> <span class=\"ow\">in</span> <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">fields</span><span class=\"p\">]</span>\n             <span class=\"n\">header</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;,&quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">fields</span><span class=\"p\">)</span>\n             <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stream</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s2\">&quot;model,</span><span class=\"si\">{</span><span class=\"n\">header</span><span class=\"si\">}</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n         <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">stream</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"n\">dumped_object_str</span><span class=\"si\">}</span><span class=\"se\">\\n</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n\n     <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">getvalue</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n         <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">python</span><span class=\"o\">.</span><span class=\"n\">Serializer</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">getvalue</span><span class=\"p\">()</span>\n\n\n <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Deserializer</span><span class=\"p\">(</span><span class=\"n\">serializers</span><span class=\"o\">.</span><span class=\"n\">python</span><span class=\"o\">.</span><span class=\"n\">Deserializer</span><span class=\"p\">):</span>\n     <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">stream_or_string</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">):</span>\n         <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">stream_or_string</span><span class=\"p\">,</span> <span class=\"nb\">bytes</span><span class=\"p\">):</span>\n             <span class=\"n\">stream_or_string</span> <span class=\"o\">=</span> <span class=\"n\">stream_or_string</span><span class=\"o\">.</span><span class=\"n\">decode</span><span class=\"p\">()</span>\n         <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">stream_or_string</span><span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">):</span>\n             <span class=\"n\">stream_or_string</span> <span class=\"o\">=</span> <span class=\"n\">stream_or_string</span><span class=\"o\">.</span><span class=\"n\">splitlines</span><span class=\"p\">()</span>\n         <span class=\"k\">try</span><span class=\"p\">:</span>\n             <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">csv</span><span class=\"o\">.</span><span class=\"n\">DictReader</span><span class=\"p\">(</span><span class=\"n\">stream_or_string</span><span class=\"p\">)</span>\n         <span class=\"k\">except</span> <span class=\"ne\">Exception</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n             <span class=\"k\">raise</span> <span class=\"n\">DeserializationError</span><span class=\"p\">()</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">exc</span>\n         <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">objects</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">)</span>\n\n     <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_handle_object</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\">try</span><span class=\"p\">:</span>\n             <span class=\"n\">model_fields</span> <span class=\"o\">=</span> <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">[</span><span class=\"s2\">&quot;model&quot;</span><span class=\"p\">])</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">fields</span>\n             <span class=\"n\">obj</span><span class=\"p\">[</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n                 <span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">:</span> <span class=\"n\">obj</span><span class=\"p\">[</span><span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">]</span>\n                 <span class=\"k\">for</span> <span class=\"n\">field</span> <span class=\"ow\">in</span> <span class=\"n\">model_fields</span>\n                 <span class=\"k\">if</span> <span class=\"n\">field</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"ow\">in</span> <span class=\"n\">obj</span>\n             <span class=\"p\">}</span>\n             <span class=\"k\">yield from</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">_handle_object</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n         <span class=\"k\">except</span> <span class=\"p\">(</span><span class=\"ne\">GeneratorExit</span><span class=\"p\">,</span> <span class=\"n\">DeserializationError</span><span class=\"p\">):</span>\n             <span class=\"k\">raise</span>\n         <span class=\"k\">except</span> <span class=\"ne\">Exception</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n             <span class=\"k\">raise</span> <span class=\"n\">DeserializationError</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s2\">&quot;Error deserializing object: </span><span class=\"si\">{</span><span class=\"n\">exc</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">exc</span>\n</code></pre></figure>\n<p>Then add the module containing the serializer definitions to your\n<a class=\"reference internal\" href=\"/ko/5.2/ref/settings/#std-setting-SERIALIZATION_MODULES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SERIALIZATION_MODULES</span></code></a> setting:</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\">SERIALIZATION_MODULES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;csv&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;path.to.custom_csv_serializer&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;json&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.serializers.json&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"5.2\">\n<p class=\"version-note-title\">Changed in Django 5.2</p><p>A <code class=\"docutils literal notranslate\"><span class=\"pre\">Deserializer</span></code> class definition was added to each of the provided\nserialization formats.</p>\n</aside>\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=\"/ko/5.2/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=\"/ko/5.2/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=\"/ko/5.2/ref/contrib/auth/#django.contrib.auth.models.Permission\" 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=\"/ko/5.2/ref/contrib/auth/#django.contrib.auth.models.Group\" 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=\"/ko/5.2/ref/contrib/auth/#django.contrib.auth.models.User\" 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=\"/ko/5.2/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\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\">constraints</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">UniqueConstraint</span><span class=\"p\">(</span>\n                <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">],</span>\n                <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;unique_first_last_name&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n\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><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;store.book&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Mostly Harmless&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;author&quot;</span><span class=\"p\">:</span> <span class=\"mi\">42</span><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\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\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    <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=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">PersonManager</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\">constraints</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">UniqueConstraint</span><span class=\"p\">(</span>\n                <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">],</span>\n                <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;unique_first_last_name&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">),</span>\n        <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><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Mostly Harmless&quot;</span><span class=\"p\">,</span> <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=\"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 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique=True</span></code> on a single field, or a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">UniqueConstraint</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_together</span></code> over multiple fields) for the\nfield or fields in your natural key. However, uniqueness doesn’t need to be\nenforced at the database level. If you are certain that a set of fields\nwill be effectively unique, you can still use those fields as a natural\nkey.</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\">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    <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=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">PersonManager</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\">constraints</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">UniqueConstraint</span><span class=\"p\">(</span>\n                <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">],</span>\n                <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;unique_first_last_name&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">),</span>\n        <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</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=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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 console 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>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;json&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">[</span><span class=\"n\">book1</span><span class=\"p\">,</span> <span class=\"n\">book2</span><span class=\"p\">],</span>\n<span class=\"gp\">... </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>\n<span class=\"gp\">... </span>    <span class=\"n\">use_natural_primary_keys</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </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=\"/ko/5.2/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=\"/ko/5.2/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=\"/ko/5.2/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=\"natural-keys-and-forward-references\">\n<span id=\"id6\"></span><h3>Natural keys and forward references<a class=\"heading-anchor\" href=\"#natural-keys-and-forward-references\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Sometimes when you use <a class=\"reference internal\" href=\"#topics-serialization-natural-keys\"><span class=\"std std-ref\">natural foreign keys</span></a> you’ll need to deserialize data where\nan object has a foreign key referencing another object that hasn’t yet been\ndeserialized. This is called a “forward reference”.</p>\n<p>For instance, suppose you have the following objects in your fixture:</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.book&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Mostly Harmless&quot;</span><span class=\"p\">,</span> <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=\"o\">...</span>\n<span class=\"p\">{</span><span class=\"s2\">&quot;model&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;store.person&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Douglas&quot;</span><span class=\"p\">,</span> <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=\"o\">...</span>\n</code></pre></div>\n<p>In order to handle this situation, you need to pass\n<code class=\"docutils literal notranslate\"><span class=\"pre\">handle_forward_references=True</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">serializers.deserialize()</span></code>. This will\nset the <code class=\"docutils literal notranslate\"><span class=\"pre\">deferred_fields</span></code> attribute on the <code class=\"docutils literal notranslate\"><span class=\"pre\">DeserializedObject</span></code> instances.\nYou’ll need to keep track of <code class=\"docutils literal notranslate\"><span class=\"pre\">DeserializedObject</span></code> instances where this\nattribute isn’t <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> and later call <code class=\"docutils literal notranslate\"><span class=\"pre\">save_deferred_fields()</span></code> on them.</p>\n<p>Typical usage looks like this:</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\">objs_with_deferred_fields</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n<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;json&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">handle_forward_references</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">deferred_fields</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">objs_with_deferred_fields</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">)</span>\n\n<span class=\"k\">for</span> <span class=\"n\">obj</span> <span class=\"ow\">in</span> <span class=\"n\">objs_with_deferred_fields</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save_deferred_fields</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>For this to work, the <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> on the referencing model must have\n<code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>.</p>\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>It’s often possible to avoid explicitly having to handle forward references by\ntaking care with the ordering of objects within a fixture.</p>\n<p>To help with this, calls to <a class=\"reference internal\" href=\"/ko/5.2/ref/django-admin/#django-admin-dumpdata\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dumpdata</span></code></a> that use the <a class=\"reference internal\" href=\"/ko/5.2/ref/django-admin/#cmdoption-dumpdata-natural-foreign\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">dumpdata</span>\n<span class=\"pre\">--natural-foreign</span></code></a> option will serialize any model with a <code class=\"docutils literal notranslate\"><span class=\"pre\">natural_key()</span></code>\nmethod 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\n\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=\"s2\">&quot;example_app.person&quot;</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":"JSONL","anchor":"serialization-formats-jsonl","children":[]},{"title":"YAML","anchor":"yaml","children":[]},{"title":"Custom serialization formats","anchor":"custom-serialization-formats","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":"Natural keys and forward references","anchor":"natural-keys-and-forward-references","children":[]},{"title":"Dependencies during serialization","anchor":"dependencies-during-serialization","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django 사용하기","url":"/ko/5.2/topics/"}],"prev":{"docname":"topics/performance","title":"성능과 최적화","url":"/ko/5.2/topics/performance/"},"next":{"docname":"topics/settings","title":"Django settings","url":"/ko/5.2/topics/settings/"},"formats":{"html":"/ko/5.2/topics/serialization/","markdown":"/ko/5.2/topics/serialization.md","json":"/ko/5.2/topics/serialization.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/serialization.txt","official":"https://docs.djangoproject.com/ko/5.2/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"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}