Skip to content

Commit de9ce6a

Browse files
Fixed deserialization of datetime.date fields (#1914) (#1915)
Fixes #1913 (cherry picked from commit 6db7e9d) Co-authored-by: Miguel Grinberg <[email protected]>
1 parent c7c5db2 commit de9ce6a

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

elasticsearch_dsl/field.py

+3
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

+19-1
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)