Django中如何对模型DateTimeField字段使用大于小于条件筛选
解决方法
Django ORM 不支持在 filter() 中直接使用大于/小于符号做字段比较,需要通过双下划线字段查找后缀实现对应逻辑。
第一步:先修正模型定义笔误
你当前模型中的时间字段类名多写了一个 Field 后缀,修正后代码如下:
class Quiz(models.Model): title = models.CharField(max_length=50) start = models.DateTimeField(default="2021-10-10") end = models.DateTimeField(default="2021-10-11")
第二步:使用字段查找后缀实现大小比较
常用的时间比较对应的查找后缀如下:
__lt:小于(对应<运算符)__lte:小于等于(对应<=运算符)__gt:大于(对应>运算符)__gte:大于等于(对应>=运算符)
你需要的 datetime.now() < end 条件,等价于 end 字段大于当前时间,对应写法为 end__gt=当前时间。
另外建议使用 Django 自带的 timezone.now() 代替原生 datetime.now(),避免开启时区支持后出现时间不匹配的问题。
修正后的视图代码如下:
from django.utils import timezone from rest_framework import generics class GetQuizView(generics.ListAPIView): serializer_class = QuizListSerializer def get_queryset(self): now = timezone.now() # 仅筛选结束时间大于当前时间的Quiz # 若需要筛选当前正在进行的测验,可补充start小于等于当前时间的条件: # return Quiz.objects.filter(start__lte=now, end__gt=now) return Quiz.objects.filter(end__gt=now)
内容的提问来源于stack exchange,提问作者Arslan Yersain
相关产品推荐
相关产品推荐

