如何阻止Django模型列生成DeferredAttribute并解决过滤报错
问题根源
报错和DeferredAttribute无关,也完全不需要阻止Django生成这个属性。DeferredAttribute是Django模型字段的标准内部实现,所有模型字段都会以这个类型存在于类属性中,负责实现字段值读取、延迟加载等核心逻辑,改动这部分会直接导致整个ORM模型崩溃。
报错本质是ORM过滤语法写错了:你直接在Python层面用>=比较模型类的字段属性和字符串,相当于拿DeferredAttribute实例和字符串做原生大小比较,当然会报类型不支持的错误。Django ORM不支持用这种原生运算符写过滤条件,必须遵循框架规定的参数格式。
正确实现方式
Django ORM的filter方法接收关键字参数,用 字段名+双下划线+查找类型 的格式表达比较规则,针对你的需求,正确的过滤代码如下:
from datetime import datetime # 建议传入明确的datetime类型对象,不要直接传字符串,避免格式解析、时区偏差问题 target_date = datetime(2022, 7, 13) test = RunCounts.objects.filter(RunDate__gte=target_date)
补充说明
常用的大小比较查找后缀:
__gte:对应大于等于(greater than or equal)__gt:对应大于(greater than)__lte:对应小于等于(less than or equal)__lt:对应小于(less than)
如果RunDate是带时分秒的DateTimeField,只想按日期维度做匹配,可以再加__date后缀匹配日期部分,这种写法支持直接传入日期字符串:
test = RunCounts.objects.filter(RunDate__date__gte='2022-07-13')
如果项目开启了Django的时区支持,建议使用django.utils.timezone提供的方法生成带时区信息的时间对象,避免UTC时间和本地时间不一致导致的过滤结果偏差。
内容的提问来源于stack exchange,提问作者Dobbs760
相关产品推荐
相关产品推荐

