排除日期时间字段值大于当前日期和时间的对象

时间:2018-03-14 10:58:22

标签: python django python-3.x

我有一个To To类,它有一个死线属性。

class ToDo(models.Model):
    ...
    ...
    dead_line = models.DateTimeField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)

我想得到所有的待办事项,除了那些死线值超过当前日期和时间的待办事项。我试过这种方式:

to_do_list = user.todo_set.all().exclude(dead_line__lte=datetime.now(pytz.timezone('Asia/Kolkata')))

但是,这给了我所有的待办事项。

同样,这很好,并且排除了当前的待办事项:

to_do_list = user.todo_set.all().exclude(dead_line__day=datetime.now(pytz.timezone('Asia/Kolkata')).day)

我做错了什么?如何获得所有待办事项的死线超过当前日期和时间?

更新

我已设置TIME_ZONE = 'Asia/Kolkata'USE_TZ = True

示例数据:

>>> datetime.now(pytz.timezone('Asia/Kolkata')).strftime("%Y-%m-%d %I:%M %p")
'2018-03-14 05:04 PM'

>>> user.todo_set.all()
<QuerySet [<ToDo: Run on 2018-03-18 08:30 AM>, <ToDo: Learn on 2018-03-14 11:30 AM>, <ToDo: Ready on 2018-03-15 11:30 AM>, <ToDo: Play on 2018-03-16 11:30 AM>, <ToDo: Hunt on 2018-03-17 11:30 AM>, <ToDo: Test on 2018-03-18 11:30 AM>]>

如您所见,排除列表时,应从列表中排除ToDo对象<ToDo: Learn on 2018-03-14 11:30 AM>,但事实并非如此。

更新

通过使用for循环循环,返回预期结果。

>>> to_do_list = []
>>> 
>>> 
>>> for todo in user.todo_set.all():
...     if todo.dead_line > datetime.now(pytz.timezone('Asia/Kolkata')):
...             to_do_list.append(todo)
...
>>> to_do_list
[<ToDo: Run on 2018-03-18 08:30 AM>, <ToDo: Ready on 2018-03-15 11:30 AM>, <ToDo: Play on 2018-03-16 11:30 AM>, <ToDo: Hunt on 2018-03-17 11:30 AM>, <ToDo: Test on 2018-03-18 11:30 AM>]

2 个答案:

答案 0 :(得分:1)

  

如何获得所有待办事项,其死线大于当前日期和时间

我猜您使用lte代替gt(大于)?只获得截止日期晚于现在的待办事项

  

to_do_list = user.todo_set.all()。filter(dead_line__gt = datetime.now(pytz.timezone('Asia / Kolkata')))

除非您使用时区Koalkata存储所有内容,否则这可能是一个空的查询集。你应该总是使用UTC。 请注意,您正在查找某个用户的ToDos。确保用户有数据。

你使用的第二种方法似乎是错误的。你比较的是一天,这是一个1-30范围内的数字,aprox https://docs.python.org/2/library/datetime.html

  

date.day     在给定年份的给定月份的1天和天数之间

答案 1 :(得分:0)

尝试使用filter()

from django.utils import timezone
user.todo_set.filter(dead_line_date__gt=timezone.now())

并更新您的设置以使用时区感知

USE_TZ=True