Skip to content

Commit 6db7e9d

Browse files
Fixed deserialization of datetime.date fields (#1914)
Fixes #1913
1 parent 8a72af9 commit 6db7e9d

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

elasticsearch_dsl/field.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,9 @@ def _deserialize(self, data: Any) -> Union[datetime, date]:
315315
raise ValidationException(
316316
f"Could not parse date from the value ({data!r})", e
317317
)
318+
# we treat the yyyy-MM-dd format as a special case
319+
if hasattr(self, "format") and self.format == "yyyy-MM-dd":
320+
data = data.date()
318321

319322
if isinstance(data, datetime):
320323
if self._default_timezone and data.tzinfo is None:

tests/test_field.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import base64
1919
import ipaddress
20-
from datetime import datetime
20+
from datetime import date, datetime, time
2121
from typing import cast
2222

2323
import pytest
@@ -48,6 +48,24 @@ def test_boolean_deserialization() -> None:
4848
assert bf.deserialize(1)
4949

5050

51+
def test_datetime_deserialization() -> None:
52+
f = field.Date()
53+
dt = datetime.now()
54+
assert dt == f._deserialize(dt.isoformat())
55+
56+
d = date.today()
57+
assert datetime.combine(d, time()) == f._deserialize(d.isoformat())
58+
59+
60+
def test_date_deserialization() -> None:
61+
f = field.Date(format="yyyy-MM-dd")
62+
d = date.today()
63+
assert d == f._deserialize(d.isoformat())
64+
65+
dt = datetime.now()
66+
assert dt.date() == f._deserialize(dt.isoformat())
67+
68+
5169
def test_date_field_can_have_default_tz() -> None:
5270
f = field.Date(default_timezone="UTC")
5371
now = datetime.now()

0 commit comments

Comments
 (0)