Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions rest_framework/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ def unicode_http_header(value):
return value


# django-mongodb-backend
try:
from bson import ObjectId
except ImportError:
ObjectId = None


# django.contrib.postgres requires psycopg2
try:
from django.contrib.postgres import fields as postgres_fields
Expand Down
14 changes: 14 additions & 0 deletions rest_framework/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@
except ImportError:
pytz = None

try:
from bson import ObjectId
except ImportError:
ObjectId = None

from rest_framework import ISO_8601
from rest_framework.compat import ip_address_validators
from rest_framework.exceptions import ErrorDetail, ValidationError
Expand Down Expand Up @@ -1745,6 +1750,15 @@ def __init__(self, **kwargs):
)


class ObjectIdRestField(Field):
def to_internal_value(self, data):
if not ObjectId.is_valid(data):
raise ValidationError('Invalid ObjectId')

def to_representation(self, value):
return value


class JSONField(Field):
default_error_messages = {
'invalid': _('Value must be valid JSON.')
Expand Down
5 changes: 4 additions & 1 deletion rest_framework/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from django.utils.translation import gettext_lazy as _

from rest_framework.compat import (
get_referenced_base_fields_from_q, postgres_fields
get_referenced_base_fields_from_q, postgres_fields, ObjectId
)
from rest_framework.exceptions import ErrorDetail, ValidationError
from rest_framework.fields import get_error_detail
Expand Down Expand Up @@ -938,6 +938,9 @@ class ModelSerializer(Serializer):
serializer_field_mapping[postgres_fields.HStoreField] = HStoreField
serializer_field_mapping[postgres_fields.ArrayField] = ListField
serializer_field_mapping[postgres_fields.JSONField] = JSONField
if ObjectId:
from .fields import ObjectIdRestField
serializer_field_mapping[models.AutoField] = ObjectIdRestField
serializer_related_field = PrimaryKeyRelatedField
serializer_related_to_field = SlugRelatedField
serializer_url_field = HyperlinkedIdentityField
Expand Down
Loading