基于日期过滤SubscribeEmailModel得到空QuerySet,请求排查问题
Django过滤返回空QuerySet问题排查
可能的原因及解决方法
1. 日期类型不匹配
你的过滤条件里用了datetime.datetime.today(),但Lesson.startdate是DateField,存储的是纯日期(无时分秒),而datetime.today()返回的是带时间的datetime对象,类型不匹配会导致过滤不到数据。
解决方法:改用日期类型的今日值,替换成datetime.date.today()(需导入from datetime import date):
subscriber = SubscribeEmailModel.objects.filter( topic__startdate=date.today(), sent_mail=False )
2. ListView类属性查询仅执行一次
你在AutoSendNotification类中直接定义subscriber类属性,这段代码只会在类加载时执行一次,不会随每次请求动态更新过滤结果。
正确做法是重写get_queryset方法,在方法内执行动态查询:
from datetime import date from django.views.generic import ListView from .models import SubscribeEmailModel class AutoSendNotification(ListView): model = SubscribeEmailModel context_object_name = 'subscriber' template_name = 'superadmin/email/auto-send.html' def get_queryset(self): queryset = SubscribeEmailModel.objects.filter( topic__startdate=date.today(), sent_mail=False ) print(queryset) return queryset
3. 数据库无符合条件的数据
- 检查
Lesson表:startdate的auto_now=True仅在每次保存Lesson对象时更新日期,旧的Lesson记录不会自动同步今日日期,需重新保存对象才会更新。 - 检查
SubscribeEmailModel表:确认存在sent_mail=False且关联上述有效Lesson的记录。
4. 外键关联有效性
确认SubscribeEmailModel的topic外键关联的是存在的Lesson对象,无关联已删除或无效的Lesson记录。
内容的提问来源于stack exchange,提问作者Ayodeji Ogunsakin
相关产品推荐
相关产品推荐

