diff --git a/django/core/serializers/__init__.py b/django/core/serializers/__init__.py
index 7afc94c..815db4a 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 SerializerNotFound |
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 SerializerNotFound(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..e520f06 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 SerializerNotFound(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..e46fb2c 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.SerializerNotFound` 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..02c71d5 100644
a
|
b
|
except ImportError:
|
17 | 17 | |
18 | 18 | from django.conf import settings |
19 | 19 | from django.core import serializers, management |
| 20 | from django.core.serializers import SerializerNotFound |
20 | 21 | from django.db import transaction, DEFAULT_DB_ALIAS, connection |
21 | 22 | from django.test import TestCase |
22 | 23 | from django.utils.functional import curry |
… |
… |
if connection.features.allows_primary_key_0:
|
350 | 351 | # Dynamically create serializer tests to ensure that all |
351 | 352 | # registered serializers are automatically tested. |
352 | 353 | class SerializerTests(TestCase): |
353 | | pass |
354 | | |
| 354 | def test_get_unknown_serializer(self): |
| 355 | """ |
| 356 | #15889: get_serializer('unknown_format') raises a SerializerNotFound |
| 357 | """ |
| 358 | unknown = 'unknown format' |
| 359 | self.assertRaises(SerializerNotFound, |
| 360 | serializers.get_serializer, unknown) |
| 361 | # SerializerNotFound subclasses KeyError for backwards compatibility |
| 362 | self.assertRaises(KeyError, serializers.get_serializer, 'unknown') |
| 363 | |
| 364 | # SerializerNotFound is instantiated with the non-existent format |
| 365 | try: |
| 366 | serializers.get_serializer(unknown) |
| 367 | except SerializerNotFound as (msg,): |
| 368 | self.assertEqual(msg, unknown) |
| 369 | |
| 370 | def test_get_known_serializer(self): |
| 371 | """ |
| 372 | #15889: make sure getting an existing serializer still works fine |
| 373 | """ |
| 374 | format, module = serializers.BUILTIN_SERIALIZERS.items()[0] |
| 375 | self.assertEqual(serializers.get_serializer(format).__module__, module) |
| 376 | |
355 | 377 | def serializerTest(format, self): |
356 | 378 | |
357 | 379 | # Create all the objects defined in the test data |