【问题标题】:Django query: How to filter objects by todays day, time and after 30 minutes?Django 查询:如何按今天、时间和 30 分钟后过滤对象?
【发布时间】:2012-10-02 00:38:04
【问题描述】:

我在模型中有一个字段,例如:

class Sample(models.Model): 
    start = models.TimeField(verbose_name=_("start time")) 
    end = models.TimeField(verbose_name=_("end time"))

现在,需要按“开始”和“结束”属性过滤我的对象,例如,它应该按今天、时间和 30 分钟内的时间过滤所有对象。

我试过了:

 models.Sample.objects.filter(start__gt=datetime.now(),
                             end__lt=datetime.now() + timedelta(minutes=30))

我知道,使用两个过滤器进行过滤是一个错误。我的代码到今天还没有过滤。例如,我需要今天(星期二)从 12h 到 12:30h 拥有所有对象

提前感谢您的帮助。

【问题讨论】:

  • 你的意思是用两个过滤器过滤是错误的?您仅使用一个具有两个条件的过滤器功能。您还可以澄清您要过滤的内容。我仍然对“今天的所有对象,时间和 30 分钟内的时间”是什么意思感到困惑。
  • 我的意思是我正在链接过滤器,在我的情况下这是一个错误。我有一个按时间范围开始和结束的对象,例如开始 10:15 - 结束 12:00, 12:00 - 15:30... 我需要过滤对象,并且只获取那些从今天开始的对象,当前时间,在 30 分钟内。
  • 为了能够按今天进行过滤,您必须更改您的字段以使用DateTime

标签: python mysql database django


【解决方案1】:

您在模型声明中使用了 TimeField。它只存储时间,没有日期、月份或年份的数据。

时间,在 Python 中由 datetime.time 实例表示

所以不要使用datetime.now(),而是使用datetime.now().time(),而不是datetime.now() + timedelta(minutes=30),使用(datetime.now() + timedelta(minutes=30)).time()

为了能够包含按日、月、年和时间进行过滤,请将模型中的 TimeField 替换为 DateTimeField。使用datetime.now()timedelta(minutes=30) 的过滤将与您原来的问题一样。

【讨论】:

  • 对不起,我没有提到,我在模型中也有“week_day”和“week_type”:( week_day = models.IntegerField(choices=WORK_DAYS, verbose_name=_("day of week" )) –
  • 那应该可以正常工作,只需在我的回答中对日期时间对象使用 .time() 即可。
  • 当我更改 timedelta.(minutes=30).time() 时,出现错误:'datetime.timedelta' object has no attribute 'time'
  • 是 (datetime.now() + timedelta(minutes=30)).time()。正确注意括号
  • 好的,谢谢,它有效。还有一个问题,我如何在同一个查询中按 week_day 和 time 进行过滤?
猜你喜欢
  • 2014-06-13
  • 2011-01-03
  • 2012-08-21
  • 2016-03-11
  • 2014-06-03
  • 2021-10-25
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多