summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--django/core/serializers/__init__.py7
-rw-r--r--django/core/serializers/base.py4
-rw-r--r--docs/topics/serialization.txt6
-rw-r--r--tests/regressiontests/serializers_regress/tests.py26
5 files changed, 42 insertions, 2 deletions
diff --git a/AUTHORS b/AUTHORS
index ddd3cf8566..a32e0d62cb 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -35,6 +35,7 @@ answer newbie questions, and generally made Django that much better:
Gisle Aas <gisle@aas.no>
Chris Adams
+ Mathieu Agopian <mathieu.agopian@gmail.com>
ajs <adi@sieker.info>
alang@bright-green.com
A S Alam <aalam@users.sf.net>
diff --git a/django/core/serializers/__init__.py b/django/core/serializers/__init__.py
index 7afc94c1d0..09bcb651d5 100644
--- a/django/core/serializers/__init__.py
+++ b/django/core/serializers/__init__.py
@@ -18,6 +18,7 @@ To add your own serializers, use the SERIALIZATION_MODULES setting::
from django.conf import settings
from django.utils import importlib
+from django.core.serializers.base import SerializerDoesNotExist
# Built-in serializers
BUILTIN_SERIALIZERS = {
@@ -60,11 +61,15 @@ def unregister_serializer(format):
"Unregister a given serializer. This is not a thread-safe operation."
if not _serializers:
_load_serializers()
+ if format not in _serializers:
+ raise SerializerDoesNotExist(format)
del _serializers[format]
def get_serializer(format):
if not _serializers:
_load_serializers()
+ if format not in _serializers:
+ raise SerializerDoesNotExist(format)
return _serializers[format].Serializer
def get_serializer_formats():
@@ -80,6 +85,8 @@ def get_public_serializer_formats():
def get_deserializer(format):
if not _serializers:
_load_serializers()
+ if format not in _serializers:
+ raise SerializerDoesNotExist(format)
return _serializers[format].Deserializer
def serialize(format, queryset, **options):
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index cdcc7fa36a..6afaf216a8 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -8,6 +8,10 @@ from django.db import models
from django.utils.encoding import smart_str, smart_unicode
from django.utils import datetime_safe
+class SerializerDoesNotExist(KeyError):
+ """The requested serializer was not found."""
+ pass
+
class SerializationError(Exception):
"""Something bad happened during serialization."""
pass
diff --git a/docs/topics/serialization.txt b/docs/topics/serialization.txt
index c8acc8539e..f0f17b2ee2 100644
--- a/docs/topics/serialization.txt
+++ b/docs/topics/serialization.txt
@@ -38,6 +38,12 @@ This is useful if you want to serialize data directly to a file-like object
out = open("file.xml", "w")
xml_serializer.serialize(SomeModel.objects.all(), stream=out)
+.. note::
+
+ Calling :func:`~django.core.serializers.get_serializer` with an unknown
+ :ref:`format <serialization-formats>` will raise a
+ :class:`~django.core.serializers.SerializerDoesNotExist` exception.
+
Subset of fields
~~~~~~~~~~~~~~~~
diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py
index de57a6f0de..97b2a792eb 100644
--- a/tests/regressiontests/serializers_regress/tests.py
+++ b/tests/regressiontests/serializers_regress/tests.py
@@ -6,7 +6,7 @@ test case that is capable of testing the capabilities of
the serializers. This includes all valid data values, plus
forward, backwards and self references.
"""
-
+from __future__ import with_statement
import datetime
import decimal
@@ -17,6 +17,7 @@ except ImportError:
from django.conf import settings
from django.core import serializers, management
+from django.core.serializers import SerializerDoesNotExist
from django.db import transaction, DEFAULT_DB_ALIAS, connection
from django.test import TestCase
from django.utils.functional import curry
@@ -350,7 +351,28 @@ if connection.features.allows_primary_key_0:
# Dynamically create serializer tests to ensure that all
# registered serializers are automatically tested.
class SerializerTests(TestCase):
- pass
+ def test_get_unknown_serializer(self):
+ """
+ #15889: get_serializer('nonsense') raises a SerializerDoesNotExist
+ """
+ with self.assertRaises(SerializerDoesNotExist):
+ serializers.get_serializer("nonsense")
+
+ with self.assertRaises(KeyError):
+ serializers.get_serializer("nonsense")
+
+ # SerializerDoesNotExist is instantiated with the nonexistent format
+ with self.assertRaises(SerializerDoesNotExist) as cm:
+ serializers.get_serializer("nonsense")
+ self.assertEqual(cm.exception.args, ("nonsense",))
+
+ def test_unregister_unkown_serializer(self):
+ with self.assertRaises(SerializerDoesNotExist):
+ serializers.unregister_serializer("nonsense")
+
+ def test_get_unkown_deserializer(self):
+ with self.assertRaises(SerializerDoesNotExist):
+ serializers.get_deserializer("nonsense")
def serializerTest(format, self):