diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 1095c04df..46f2a7e45 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -115,23 +115,13 @@ def _resolve_model(obj): raise ValueError("{0} is not a Django model".format(obj)) - -# TODO: Remove -# contrib.postgres only supported from 1.8 onwards. +# django.contrib.postgres requires psycopg2 try: from django.contrib.postgres import fields as postgres_fields except ImportError: postgres_fields = None -# TODO: Remove -# JSONField is only supported from 1.9 onwards -try: - from django.contrib.postgres.fields import JSONField -except ImportError: - JSONField = None - - # coreapi is optional (Note that uritemplate is a dependency of coreapi) try: import coreapi @@ -298,7 +288,7 @@ class CustomValidatorMessage(object): """ We need to avoid evaluation of `lazy` translated `message` in `django.core.validators.BaseValidator.__init__`. https://github.com/django/django/blob/75ed5900321d170debef4ac452b8b3cf8a1c2384/django/core/validators.py#L297 - + Ref: https://github.com/encode/django-rest-framework/pull/5452 """ def __init__(self, *args, **kwargs): diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index b1c34b92a..fa62044c8 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -27,7 +27,6 @@ from django.utils import six, timezone from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ -from rest_framework.compat import JSONField as ModelJSONField from rest_framework.compat import postgres_fields, set_many, unicode_to_repr from rest_framework.exceptions import ErrorDetail, ValidationError from rest_framework.fields import get_error_detail, set_value @@ -861,8 +860,6 @@ class ModelSerializer(Serializer): } if ModelDurationField is not None: serializer_field_mapping[ModelDurationField] = DurationField - if ModelJSONField is not None: - serializer_field_mapping[ModelJSONField] = JSONField serializer_related_field = PrimaryKeyRelatedField serializer_related_to_field = SlugRelatedField serializer_url_field = HyperlinkedIdentityField @@ -1532,6 +1529,7 @@ if postgres_fields: ModelSerializer.serializer_field_mapping[postgres_fields.HStoreField] = CharMappingField ModelSerializer.serializer_field_mapping[postgres_fields.ArrayField] = ListField + ModelSerializer.serializer_field_mapping[postgres_fields.JSONField] = JSONField class HyperlinkedModelSerializer(ModelSerializer): diff --git a/rest_framework/utils/field_mapping.py b/rest_framework/utils/field_mapping.py index dff33d8b3..19783c15b 100644 --- a/rest_framework/utils/field_mapping.py +++ b/rest_framework/utils/field_mapping.py @@ -8,7 +8,7 @@ from django.core import validators from django.db import models from django.utils.text import capfirst -from rest_framework.compat import DecimalValidator, JSONField +from rest_framework.compat import DecimalValidator, postgres_fields from rest_framework.validators import UniqueValidator NUMERIC_FIELD_TYPES = ( @@ -88,7 +88,7 @@ def get_field_kwargs(field_name, model_field): if decimal_places is not None: kwargs['decimal_places'] = decimal_places - if isinstance(model_field, models.TextField) or (JSONField and isinstance(model_field, JSONField)): + if isinstance(model_field, models.TextField) or (postgres_fields and isinstance(model_field, postgres_fields.JSONField)): kwargs['style'] = {'base_template': 'textarea.html'} if isinstance(model_field, models.AutoField) or not model_field.editable: