diff --git a/docs/query.rst b/docs/query.rst index 75cc7975b..f82c0365f 100644 --- a/docs/query.rst +++ b/docs/query.rst @@ -221,6 +221,7 @@ The following lookup types are available: - ``iendswith`` - case insensitive ``endswith`` - ``iexact`` - case insensitive equals - ``search`` - full text search +- ``date`` - date search on datetime field e.g.; `await Team.filter(created_at__date=datetime.date(2020, 5, 20))` For PostgreSQL and MySQL, the following date related lookup types are available: diff --git a/tests/test_filtering.py b/tests/test_filtering.py index 4384e5f16..c0d7b59f2 100644 --- a/tests/test_filtering.py +++ b/tests/test_filtering.py @@ -164,6 +164,15 @@ async def test_filter_not_with_or(self): self.assertEqual(len(tournaments), 2) self.assertSetEqual({t.name for t in tournaments}, {"0", "1"}) + async def test_filter_date(self): + await DatetimeFields.create( + datetime=datetime.datetime( + year=2020, month=5, day=20, hour=0, minute=0, second=0, microsecond=0 + ) + ) + date = datetime.date(2020, 5, 20) + self.assertEqual(await DatetimeFields.filter(datetime__date=date).count(), 1) + @test.requireCapability(dialect="mysql") @test.requireCapability(dialect="postgres") async def test_filter_exact(self): diff --git a/tortoise/filters.py b/tortoise/filters.py index c2396327d..fe1cea44a 100644 --- a/tortoise/filters.py +++ b/tortoise/filters.py @@ -15,7 +15,7 @@ from pypika_tortoise import SqlContext, Table from pypika_tortoise.enums import DatePart, Matching, SqlTypes -from pypika_tortoise.functions import Cast, Extract, Upper +from pypika_tortoise.functions import Cast, Date, Extract, Upper from pypika_tortoise.terms import ( BasicCriterion, Criterion, @@ -185,6 +185,10 @@ def insensitive_ends_with(field: Term, value: str) -> Criterion: ) +def date_equal(field: Term, value: str) -> Criterion: + return Date(field).eq(value) + + def extract_year_equal(field: Term, value: int) -> Criterion: return Extract(DatePart.year, field).eq(value) @@ -523,6 +527,11 @@ def get_filters_for_field( "operator": insensitive_posix_regex, "value_encoder": string_encoder, }, + f"{field_name}__date": { + "field": actual_field_name, + "source_field": source_field, + "operator": date_equal, + }, f"{field_name}__year": { "field": actual_field_name, "source_field": source_field,