#django #django-queryset
Вопрос:
Я пытаюсь отправить электронное письмо тем заказам, которые созданы за 5 минут до даты.сейчас(). Я пытаюсь отфильтровать заказы, но это не работает, это не дает мне никакого набора запросов. Как это сделать? Я делюсь своим кодом.
def my_email():
now = datetime.now() - timedelta(minutes=5) # 11:55
now = now.replace(tzinfo=pytz.utc)
print(now)
order = Order.objects.filter(createdAt__gt = now)
print(order)
for o in order:
print(o._id)
Комментарии:
1. Каков результат приведенных выше отпечатков?
2. Уберите
now.replace(tzinfo=pytz.utc)
линию.
Ответ №1:
Вы не должны заменять часовой пояс на UTC. now()
получит текущую дату и время для данного часового пояса. Если вы замените это на UTC, то результат может быть на несколько часов раньше или позже текущего времени.
Возможно, также было бы лучше использовать Now()
выражение [Django-doc], которое будет использовать часы базы данных, таким образом, мы можем фильтровать с помощью:
from django.db.models.functions import Now
from datetime import timedelta
order = Order.objects.filter(createdAt__gt=Now()-timedelta(minutes=5))
Если вы планируете запустить это, чтобы отправлять электронные письма для заказов в течение последних пяти минут, это, однако, будет довольно подвержено ошибкам: поскольку запланированная задача всегда может иметь задержку в несколько миллисекунд, это означает, что некоторые элементы к моменту выполнения запроса могут считаться слишком старыми. Возможно, вы захотите использовать символ BooleanField
, указывающий, было ли отправлено электронное письмо.