Как изменить поле модели на основе определенного периода времени с помощью Django?
Я хочу автоматически вносить некоторые изменения в свою модель. Например, после размещения нового заказа я хочу обновить статус заказа на отмену, если isPaid не станет true в течение 1 дня после размещения заказа. как это сделать?
class Order(models.Model):
PENDING_PAYMENT = 'PENDING_PAYMENT'
status_choices = [
('CANCEL', 'Cancel'),
('PENDING_PAYMENT', 'Pending Payment'),
('ON_HOLD', 'On Hold'),
('WAITING_FOR_PAYMENT', 'Waiting For Payment'),
('PROCESSING', 'Processing'),
('DONE', 'Done'),
]
Ordinary = 'Ordinary'
customer_choices = [
('Ordinary', 'Ordinary'),
('Police', 'Police'),
('RAB', 'RAB'),
('DGIF', 'DGIF'),
('CID', 'CID'),
('NAVY', 'NAVY'),
('Air Force', 'Air Force'),
('Army', 'Army'),
('DB', 'DB'),
('Administration', 'Administration'),
]
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
paymentMethod = models.CharField(max_length=200, null=True, blank=True)
taxPrice = models.DecimalField(max_digits=11, decimal_places=2, null=True, blank=True)
shippingPrice = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
totalPrice = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True)
isPaid = models.BooleanField(default=False)
paidAt = models.DateTimeField(auto_now_add=False, null=True, blank=True)
isDelivered = models.BooleanField(default=False)
deliverAt = models.DateTimeField(auto_now_add=False, null=True, blank=True)
createdAt = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=220, choices=status_choices, default=PENDING_PAYMENT)
customerType = models.CharField(max_length=200, blank=True, null=True, choices=customer_choices, default=Ordinary)
_id = models.AutoField(primary_key=True, editable=False)
def __str__(self):
return str(self._id)
Вам нужно периодически запускать проверку заказов для обновления статуса. Вы можете использовать cron, проверьте это package.
Для достижения цели необходимо периодически выполнять функцию, которая проверяет, что фактическая дата - дата размещения (создания) заказа > 1 день, затем изменяет статус на 'cancel'.
1) Используйте django-cellery : django-celery обеспечивает интеграцию Celery для Django. Вы сможете периодически запускать задание (функцию).
2) Функция для периодического запуска. Вот пример задачи/функции, которую вы можете запустить для проверки
from datetime import timedelta, datetime
from your_app.models import Order
def cancel_order():
# Retrieve the pending orders
pending_orders = Order.objects.filter(status='PENDING_PAYMENT')
# Loop and cancel unpaid order > 1 day
for order in pending_orders:
# if the time today is greater than order created date + 1 day
if datetime.today() > (order.createdAt + timedelta(days=1)):
order.status = 'CANCEL'
order.save()
# You can also write this action in a log file too