You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django Filter筛选CharField存储的24小时内创建的时间戳记录

解决方案

核心问题是created_at为CharField,无法直接使用Django针对日期字段的__gte/__lte查询操作符。以下是无需修改模型架构的两种可行方案:


方案1:数据库层面将字符串转日期类型(推荐,支持精确时间筛选)

如果created_at的存储格式是标准可解析的日期/时间格式(如YYYY-MM-DD、YYYY-MM-DD HH:MM:SS),可以用Django内置的Cast函数将字段转为DateTimeField后再进行过滤:

from datetime import datetime, timedelta
from django.db.models import Cast, DateTimeField

# 计算24小时前的时间阈值
time_threshold = datetime.now() - timedelta(days=1)

# 筛选过去24小时内创建的Pending状态记录
results = UpdateRequests.objects.filter(
    Cast('created_at', output_field=DateTimeField())__gte=time_threshold,
    request_status="Pending"
).values()

非标准格式适配:

如果created_at是自定义格式(如DD/MM/YYYY、MM-DD-YYYY HH:MM),需要根据数据库类型自定义转换函数。以MySQL为例,可封装STR_TO_DATE函数:

from django.db.models import Func, Value

class StrToDate(Func):
    function = 'STR_TO_DATE'
    template = "%(function)s(%(expressions)s, %(format)s)"

    def __init__(self, expression, format_str, **extra):
        super().__init__(
            expression,
            format_str=Value(format_str),
            **extra
        )

然后按实际格式调用:

# 假设created_at格式为DD/MM/YYYY HH:MM:SS
results = UpdateRequests.objects.filter(
    StrToDate('created_at', '%d/%m/%Y %H:%i:%s')__gte=time_threshold,
    request_status="Pending"
).values()

方案2:将时间阈值转为匹配的字符串格式

如果created_at的字符串格式是字典序与日期顺序一致的(如YYYY-MM-DD、YYYY-MM-DD HH:MM:SS),可以直接把时间阈值转为相同格式的字符串,用字符串比较操作符筛选:

from datetime import datetime, timedelta

time_threshold = datetime.now() - timedelta(days=1)
# 按created_at的实际格式转换阈值,示例为YYYY-MM-DD HH:MM:SS
threshold_str = time_threshold.strftime('%Y-%m-%d %H:%M:%S')

results = UpdateRequests.objects.filter(
    created_at__gte=threshold_str,
    request_status="Pending"
).values()

注意:

该方案仅适用于字符串排序逻辑与日期逻辑一致的场景,若格式为DD/MM/YYYY这类无法按字符串排序的格式,会导致筛选结果错误,此时必须使用方案1。


内容的提问来源于stack exchange,提问作者Divakar Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:30:55