diff --git a/django/core/serializers/__init__.py b/django/core/serializers/__init__.py
index 7afc94c..b52165f 100644
a
|
b
|
To add your own serializers, use the SERIALIZATION_MODULES setting::
|
18 | 18 | |
19 | 19 | from django.conf import settings |
20 | 20 | from django.utils import importlib |
| 21 | from django.core.serializers.base import SerializerDoesNotExist |
21 | 22 | |
22 | 23 | # Built-in serializers |
23 | 24 | BUILTIN_SERIALIZERS = { |
… |
… |
def unregister_serializer(format):
|
65 | 66 | def get_serializer(format): |
66 | 67 | if not _serializers: |
67 | 68 | _load_serializers() |
| 69 | if format not in _serializers: |
| 70 | raise SerializerDoesNotExist(format) |
68 | 71 | return _serializers[format].Serializer |
69 | 72 | |
70 | 73 | def get_serializer_formats(): |
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index cdcc7fa..6b532af 100644
a
|
b
|
from django.db import models
|
8 | 8 | from django.utils.encoding import smart_str, smart_unicode |
9 | 9 | from django.utils import datetime_safe |
10 | 10 | |
| 11 | class SerializerDoesNotExist(KeyError): |
| 12 | """A requested serializer was not found.""" |
| 13 | pass |
| 14 | |
11 | 15 | class SerializationError(Exception): |
12 | 16 | """Something bad happened during serialization.""" |
13 | 17 | pass |
diff --git a/docs/topics/serialization.txt b/docs/topics/serialization.txt
index c8acc85..f0f17b2 100644
a
|
b
|
This is useful if you want to serialize data directly to a file-like object
|
38 | 38 | out = open("file.xml", "w") |
39 | 39 | xml_serializer.serialize(SomeModel.objects.all(), stream=out) |
40 | 40 | |
| 41 | .. note:: |
| 42 | |
| 43 | Calling :func:`~django.core.serializers.get_serializer` with an unknown |
| 44 | :ref:`format <serialization-formats>` will raise a |
| 45 | :class:`~django.core.serializers.SerializerDoesNotExist` exception. |
| 46 | |
41 | 47 | Subset of fields |
42 | 48 | ~~~~~~~~~~~~~~~~ |
43 | 49 | |
diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py
index de57a6f..6b302f0 100644
a
|
b
|
forward, backwards and self references.
|
8 | 8 | """ |
9 | 9 | |
10 | 10 | |
| 11 | from __future__ import with_statement |
11 | 12 | import datetime |
12 | 13 | import decimal |
13 | 14 | try: |
… |
… |
except ImportError:
|
17 | 18 | |
18 | 19 | from django.conf import settings |
19 | 20 | from django.core import serializers, management |
| 21 | from django.core.serializers import SerializerDoesNotExist |
20 | 22 | from django.db import transaction, DEFAULT_DB_ALIAS, connection |
21 | 23 | from django.test import TestCase |
22 | 24 | from django.utils.functional import curry |
… |
… |
if connection.features.allows_primary_key_0:
|
350 | 352 | # Dynamically create serializer tests to ensure that all |
351 | 353 | # registered serializers are automatically tested. |
352 | 354 | class SerializerTests(TestCase): |
353 | | pass |
| 355 | |
| 356 | def test_get_unknown_serializer(self): |
| 357 | """ |
| 358 | #15889: get_serializer('nonsense') raises a SerializerDoesNotExist |
| 359 | """ |
| 360 | self.assertRaises(SerializerDoesNotExist, |
| 361 | serializers.get_serializer, 'nonsense') |
| 362 | # subclasses KeyError for backwards compatibility |
| 363 | self.assertRaises(KeyError, serializers.get_serializer, 'nonsense') |
| 364 | |
| 365 | # SerializerDoesNotExist is instantiated with the inexistent format |
| 366 | with self.assertRaises(SerializerDoesNotExist) as cm: |
| 367 | serializers.get_serializer('nonsense') |
| 368 | self.assertEqual(cm.exception.args, ('nonsense',)) |
354 | 369 | |
355 | 370 | def serializerTest(format, self): |
356 | 371 | |