我有一个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>]
答案 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