Неправильно работает фильтр Django «меньше» даты-времени

#python #django #datetime #filter #django-queryset

#python #django #дата-время #Фильтр #django-набор запросов

Вопрос:

Я пытаюсь отфильтровать набор запросов Django по метке времени (меньше определенного значения). Однако фильтр, похоже, пропускает записи, которые НЕ меньше указанной метки времени. Вот пример функции:

 def check_jobs_status_3():
    current_time = datetime.utcnow()
    time_threshold = current_time - timedelta(seconds=60)
    print("$$$$$$$$$$$$ current_time = {}, timedelta = {}, time_threshold = {}".format(current_time,timedelta(seconds=60),time_threshold))
    stuck_jobs_qs = Job.objects.filter(last_updated__lt=time_threshold)
    for stuck_job in stuck_jobs_qs:
        print("############################## Job #{} (last_updated = {}) no encoding status after {} seconds. Re-enqueueing.".format(stuck_job.id,stuck_job.last_updated,get_video_encoding_timeout_seconds()))
  

Вот результат:

 $$$$$$$$$$$$ current_time = 2019-03-14 20:54:15.221554, timedelta = 0:01:00, time_threshold = 2019-03-14 20:53:15.221554
############################## Job #20 (last_updated = 2019-03-14 20:54:15.221264 00:00) no encoding status after 60 seconds. Re-enqueueing.
  

Как вы можете видеть, я получаю запись с last_updated, установленной на 2019-03-14 20:54:15, что НЕ меньше значения фильтра 2019-03-14 20:53:15

Вот определение поля last_updated:

 last_updated = models.DateTimeField(auto_now=True)
  

В чем может быть проблема?

Комментарии:

1. Пожалуйста, попробуйте использовать django timezone.now() вместо datetime.utcnow() и посмотрите, устраняет ли это проблему.

2. последнее_ обновление__lt=time_threshold.date() должно решить вашу проблему

Ответ №1:

Используйте метод Django с учетом часового пояса django.utils.timezone.now .

 from django.utils import timezone

# ...

def check_jobs_status_3():
    current_time = timezone.now()  # change this
    time_threshold = current_time - timedelta(seconds=60)
    print("$$$$$$$$$$$$ current_time = {}, timedelta = {}, time_threshold = {}".format(current_time,timedelta(seconds=60),time_threshold))
    stuck_jobs_qs = Job.objects.filter(last_updated__lt=time_threshold)
    for stuck_job in stuck_jobs_qs:
        print("############################## Job #{} (last_updated = {}) no encoding status after {} seconds. Re-enqueueing.".format(stuck_job.id,stuck_job.last_updated,get_video_encoding_timeout_seconds()))