Проблема с запросами к полю типа DateTimeField в django orm

329
10 июля 2022, 06:20

Я начал осваивать django orm. Использую django 2.0.5 и MySQL. У меня есть база данных статей блога и в ней таблица с полем publish типа DateTimeField. Я пытаюсь отфильтровать данные по году, месяцу и дню. Для этого я использую следующие запросы:

current_year_posts = Post.objects.all().filter(publish__year=current_year)
current_month_posts = Post.objects.all().filter(publish__month=current_month)
current_day_posts = Post.objects.all().filter(publish__day=current_day)

Первый запрос отрабатывает корректно и я получаю то, что мне нужно, а вот второй и третий возвращают пустые QuerySet, хотя в базе точно есть записи, удовлетворяющие этим условиям.

Это привело меня в некий диссонанс и я решил посмотреть какой sql запрос генерирует этот код. Оказалось, что первый запрос генерирует структурно другой код в блоке WHERE запроса, нежели второй и третий.

SQL-код первого запроса:

SELECT `blog_post`.`id`, `blog_post`.`title`, `blog_post`.`slug`, `blog_post`.`author_id`, `blog_post`.`body`, `blog_post`.`publish`, `blog_post`.`created`, `blog_post`.`updated`, `blog
_post`.`status` 
FROM `blog_post`
WHERE `blog_post`.`publish` BETWEEN 2020-01-01 00:00:00 AND 2020-12-31 23:59:59.999999 ORDER BY `blog_post`.`publish` DESC

SQL-код 2-го запроса(у 3 то же самое, только month на day меняется):

SELECT `blog_post`.`id`, `blog_post`.`title`, `blog_post`.`slug`, `blog_post`.`author_id`, `blog_post`.`body`, `blog_post`.`publish`, `blog_post`.`created`, `blog_post`.`updated`, `blog
_post`.`status` 
FROM `blog_post` 
WHERE EXTRACT(MONTH FROM CONVERT_TZ(`blog_post`.`publish`, 'UTC', 'UTC')) = 11 ORDER BY `blog_post`.`publish` DESC

Как изменить 2-ой и 3-ий запросы, чтобы они корректно работали?

READ ALSO
JSON-конфиги в тестах

JSON-конфиги в тестах

Подскажите, пожалуйста, есть ли какие-нибудь общепринятые практики для удобного использования конфигов в тестах? Что я имею в виду: есть один...

221
Как это сделать в qt QTcpSocket и отдельный поток

Как это сделать в qt QTcpSocket и отдельный поток

придумал вот как и это работаетно видимо сокет ждет 30 секунд, а потом обрывает связь

275