Как получить queryset в django?
Я пытаюсь отправить письмо тем ордерам, которые созданы за 5 минут до datetime.now(). Я пытаюсь отфильтровать заказы, но это не работает, не дает мне никакого набора запросов. Как это сделать? Я делюсь своим кодом.
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)
Не следует заменять часовой пояс на 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
, который указывает, было ли отправлено письмо.