Расхождение в количестве записей между Django ORM и сырым SQL-запросом
Я столкнулся с проблемой, когда количество записей, возвращаемое ORM-запросом Django, не совпадает с количеством, возвращаемым необработанным SQL-запросом. Вот соответствующая часть моего представления Django:
start_date = datetime(2024, 10, 19, 0, 0, 0)
end_date = datetime(2024, 10, 19, 23, 59, 59)
dbug = Reservations.objects.all().filter(updated_at__range=(start_date, end_date))
print(dbug.count())
Выше возвращается 6529
В файле Django settings.py содержится:
TIME_ZONE = 'Asia/Tehran'
USE_TZ = False
Я попробовал SQL-запрос, который приведен ниже:
SELECT COUNT(*) FROM "consultant_reservations"
WHERE updated_at BETWEEN '2024-10-19 00:00:00' AND '2024-10-19 23:59:59';
count
-------
6540
(1 row)
Вот несоответствие между результатом SQL запроса ( который равен 6540), который я пробовал в psql терминале и результатом Django ORM ( который равен 6529)
Пожалуйста, позвольте мне представить пример:
Попытка выполнить SQL-запрос, аналогичный:
SELECT * FROM "consultant_reservations"
WHERE updated_at BETWEEN '2024-10-19 00:00:00' AND '2024-10-19 23:59:59' LIMIT 4;
Результат:
id | idd | voip_number | client_id | client_mobile | reserve_duration | status | reserve_timestamp | created_at | updated_at | consultant_id_id | mobile_id | created_by | updated_by
-------+---------+-------------+-----------+---------------+------------------+----------+------------------------+------------------------+------------------------+------------------+-----------+------------+------------
76407 | 2011050 | 2217 | 1101151 | 09355648120 | 3600 | reserved | 2024-10-19 19:30:00+00 | 2024-10-14 08:40:03+00 | 2024-10-19 20:28:01+00 | 5052 | 2395781 | 3445 | 0
1408 | 1958653 | 1119 | 754939 | 09142477905 | 3600 | reserved | 2024-10-19 05:30:00+00 | 2024-09-28 06:17:04+00 | 2024-10-19 06:28:01+00 | 3791 | 974986 | 87 | 0
1514 | 1958759 | 2571 | 947805 | 09334143576 | 3600 | reserved | 2024-10-19 09:30:00+00 | 2024-09-28 06:34:05+00 | 2024-10-19 10:28:01+00 | 5374 | 1711586 | 3802 | 0
60371 | 1997347 | 2589 | 1070143 | 09033927800 | 3600 | reserved | 2024-10-19 12:30:00+00 | 2024-10-09 11:42:37+00 | 2024-10-19 13:28:02+00 | 5385 | 2279104 | 3814 | 0
(4 rows)
Попытка запроса Django такая же, как:
start_date = datetime(2024, 10, 19, 0, 0, 0)
end_date = datetime(2024, 10, 19, 23, 59, 59)
dbug = Reservations.objects.all().filter(updated_at__range=(start_date, end_date))[:4]
data = list(dbug.values())
df = pd.DataFrame(data)
print(df.head(4))
Результат:
id idd consultant_id_id voip_number client_id client_mobile ... status reserve_timestamp created_at created_by updated_by updated_at
0 76407 2011050 5052 2217 1101151 09355648120 ... reserved 2024-10-19 23:00:00 2024-10-14 12:10:03 3445 0 2024-10-19 23:58:01
1 1408 1958653 3791 1119 754939 09142477905 ... reserved 2024-10-19 09:00:00 2024-09-28 09:47:04 87 0 2024-10-19 09:58:01
2 1514 1958759 5374 2571 947805 09334143576 ... reserved 2024-10-19 13:00:00 2024-09-28 10:04:05 3802 0 2024-10-19 13:58:01
3 60371 1997347 5385 2589 1070143 09033927800 ... reserved 2024-10-19 16:00:00 2024-10-09 15:12:37 3814 0 2024-10-19 16:58:02
[4 rows x 14 columns]
Показывает, что обнаруженное расхождение в результатах sql между или одно.
Таблице consultant_reservations присвоена модель Reservation.
«Благодарности».