【问题标题】:Filter datetime field python过滤日期时间字段python
【发布时间】:2020-11-27 16:16:56
【问题描述】:

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)

【问题讨论】:

    标签: python mysql django django-queryset drf-queryset


    【解决方案1】:

    数据库中的字段是日期时间,所以 Django 将日期强制转换为日期时间;日期时间的默认时间是午夜。

    如果您的输入是日期,您可以

    • 在结束日期上加一天,并使用lt 而不是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"))
    )
    

    【讨论】:

    • 对于另一个服务,我先做from datetime import datetime,你的解决方案给了我一个错误,我要做的是下一个:start_datetime = datetime.combine(start_date, datetime.time()) end_datetime = datetime.combine(end_date, datetime.time(23, 59, 59)) 但返回:descriptor 'time' of 'datetime.datetime' object需要一个参数如果我做:start_datetime = datetime.combine(start_date, time()) end_datetime = datetime.combine(end_date, time(23, 59, 59))return: name 'time' is not defined
    • 这就是为什么你需要import datetime,完整的模块。
    猜你喜欢
    • 1970-01-01
    • 2018-01-07
    • 2022-08-22
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多