Skip to content

Commit 2964602

Browse files
dongfangtianyucarltongibson
authored andcommitted
Fix DateField and DateTimeField type in OpenAPI schemas.
1 parent f74d3bf commit 2964602

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

rest_framework/schemas/openapi.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,14 +254,26 @@ def _map_field(self, field):
254254
'type': 'array',
255255
}
256256

257+
# DateField and DateTimeField type is string
258+
if isinstance(field, serializers.DateField):
259+
return {
260+
'type': 'string',
261+
'format': 'date',
262+
}
263+
264+
if isinstance(field, serializers.DateTimeField):
265+
return {
266+
'type': 'string',
267+
'format': 'date-time',
268+
}
269+
257270
# Simplest cases, default to 'string' type:
258271
FIELD_CLASS_SCHEMA_TYPE = {
259272
serializers.BooleanField: 'boolean',
260273
serializers.DecimalField: 'number',
261274
serializers.FloatField: 'number',
262275
serializers.IntegerField: 'integer',
263-
serializers.DateField: 'date',
264-
serializers.DateTimeField: 'date-time',
276+
265277
serializers.JSONField: 'object',
266278
serializers.DictField: 'object',
267279
}

tests/schemas/test_openapi.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,20 @@ def test_schema_construction(self):
196196

197197
assert 'openapi' in schema
198198
assert 'paths' in schema
199+
200+
def test_serializer_datefield(self):
201+
patterns = [
202+
url(r'^example/?$', views.ExampleGenericViewSet.as_view({"get": "get"})),
203+
]
204+
generator = SchemaGenerator(patterns=patterns)
205+
206+
request = create_request('/')
207+
schema = generator.get_schema(request=request)
208+
209+
response = schema['paths']['/example/']['get']['responses']
210+
response_schema = response['200']['content']['application/json']['schema']['properties']
211+
212+
assert response_schema['date']['type'] == response_schema['datetime']['type'] == 'string'
213+
214+
assert response_schema['date']['format'] == 'date'
215+
assert response_schema['datetime']['format'] == 'date-time'

tests/schemas/views.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
from rest_framework import permissions
1+
from rest_framework import permissions, serializers
2+
from rest_framework.response import Response
23
from rest_framework.views import APIView
4+
from rest_framework.viewsets import GenericViewSet
35

46

57
class ExampleListView(APIView):
@@ -17,3 +19,18 @@ class ExampleDetailView(APIView):
1719

1820
def get(self, *args, **kwargs):
1921
pass
22+
23+
24+
class ExampleGenericViewSet(GenericViewSet):
25+
class ExampleSerializer(serializers.Serializer):
26+
date = serializers.DateField()
27+
datetime = serializers.DateTimeField()
28+
29+
serializer_class = ExampleSerializer
30+
31+
def get(self, *args, **kwargs):
32+
from datetime import datetime
33+
now = datetime.now()
34+
35+
serializer = self.get_serializer(data=now.date(), datetime=now)
36+
return Response(serializer.data)

0 commit comments

Comments
 (0)