Как изменить поле модели на основе определенного периода времени с помощью 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
Вернуться на верх