[1.8.x] Fixed #25019 -- Added UUID support in DjangoJSONEncoder
Backport of6355a6d4f5
and2e05ef4e18
from master.
This commit is contained in:
parent
0db2cdb1fa
commit
ebcfedb0e5
|
@ -8,6 +8,7 @@ from __future__ import absolute_import, unicode_literals
|
|||
import datetime
|
||||
import decimal
|
||||
import json
|
||||
import uuid
|
||||
import sys
|
||||
|
||||
from django.core.serializers.base import DeserializationError
|
||||
|
@ -86,7 +87,7 @@ def Deserializer(stream_or_string, **options):
|
|||
|
||||
class DjangoJSONEncoder(json.JSONEncoder):
|
||||
"""
|
||||
JSONEncoder subclass that knows how to encode date/time and decimal types.
|
||||
JSONEncoder subclass that knows how to encode date/time, decimal types and UUIDs.
|
||||
"""
|
||||
def default(self, o):
|
||||
# See "Date Time String Format" in the ECMA-262 specification.
|
||||
|
@ -108,6 +109,8 @@ class DjangoJSONEncoder(json.JSONEncoder):
|
|||
return r
|
||||
elif isinstance(o, decimal.Decimal):
|
||||
return str(o)
|
||||
elif isinstance(o, uuid.UUID):
|
||||
return str(o)
|
||||
else:
|
||||
return super(DjangoJSONEncoder, self).default(o)
|
||||
|
||||
|
|
|
@ -9,4 +9,5 @@ Django 1.8.4 fixes several bugs in 1.8.3.
|
|||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Added the ability to serialize values from the newly added
|
||||
:class:`~django.db.models.UUIDField` (:ticket:`25019`).
|
||||
|
|
|
@ -6,6 +6,7 @@ import json
|
|||
import os
|
||||
import pickle
|
||||
import unittest
|
||||
import uuid
|
||||
|
||||
from django.core.exceptions import SuspiciousOperation
|
||||
from django.core.serializers.json import DjangoJSONEncoder
|
||||
|
@ -480,6 +481,11 @@ class JsonResponseTests(TestCase):
|
|||
response = JsonResponse(['foo', 'bar'], safe=False)
|
||||
self.assertEqual(json.loads(response.content.decode()), ['foo', 'bar'])
|
||||
|
||||
def test_json_response_uuid(self):
|
||||
u = uuid.uuid4()
|
||||
response = JsonResponse(u, safe=False)
|
||||
self.assertEqual(json.loads(response.content.decode()), str(u))
|
||||
|
||||
def test_json_response_custom_encoder(self):
|
||||
class CustomDjangoJSONEncoder(DjangoJSONEncoder):
|
||||
def encode(self, o):
|
||||
|
|
Loading…
Reference in New Issue