Поле даты и времени фильтра python - PullRequest
0 голосов
/ 07 августа 2020

Json получение python:

{
    "str_ini": "2020-06-05",
    "fnsh_date": "2020-06-20",
}

Я использую str_ini и fnsh_date в качестве параметра для построения моего запроса.

OrderModel.py:

fservice = models.DateTimeField(db_column='FService') # (In DB this field is datetime)
ffinishservice = models.DateTimeField(db_column='FFinishService') # (In DB this field is datetime)

Views.py:

pedidoparams = request.data
start_date = pedidoparams.get("str_ini")
finish_date = pedidoparams.get("fnsh_date")
order = (
    OrderModel.objects.values("zone__zone")
    .filter(fservice__gte=fecha_inicio)
    .filter(ffinishservice__lte=fecha_final)
    .annotate(order_activate=Count("cctt__id"))
)
print("query: ", str(pedidos.query))

И python напечатайте этот запрос:

query:  SELECT `zone`.`Zone` AS `Zone`, COUNT(`order`.`cctt_id`) AS `order_activate` FROM `order` INNER JOIN `zone` ON (`order`.`Zone_Id` = `zone`.`Id`) WHERE (`order`.`fservice` >= 2020-06-05 00:00:00 AND `order`.`ffinishservice` <= 2020-06-20 00:00:00) GROUP BY `zone`.`Zone`

Мой вопрос: зачем вы добавляете часы, минуты и секунды к запросу? В случае получения только дат, возможно ли, что в запросе это было:

... Where (`order`.`fservice` >= 2020-06-05 00:00:00 AND `order`.`ffinishservice` <= 2020-06-20 23:59:59)

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Вы добавляете часы, минуты и секунды к запросу, поскольку ваша модель состоит из полей DateTime.

0 голосов
/ 07 августа 2020

Поле в базе данных - это datetime, поэтому Django переводит даты в datetime; время по умолчанию для datetime от даты - полночь.

Если ваши входные данные являются датами, вы можете

  • добавить один день к дате окончания и использовать вместо него lt of lte
  • объедините дату окончания с 23:59:59 и продолжайте использовать lte (который может пропустить дополнительную секунду, но это, вероятно, не имеет значения)
from django.utils.dateparse import parse_date
import datetime


start_date = parse_date(pedidoparams["str_ini"])
finish_date = parse_date(pedidoparams["fnsh_date"])
start_datetime = datetime.datetime.combine(start_date, datetime.time())
end_datetime = datetime.datetime.combine(end_date, datetime.time(23, 59, 59))

order = (
    OrderModel.objects.values("zone__zone")
    .filter(fservice__gte=start_datetime)
    .filter(ffinishservice__lte=end_datetime)
    .annotate(order_activate=Count("cctt__id"))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...