跳到主要内容

更新订单状态

在本节中,我们将介绍如何使用Django和Celery定时任务来自动更新订单表中的订单状态。我们将创建一个定时任务,每隔一定时间检查所有订单的状态是否过期,如果过期则将其更改为已关闭。

步骤​

1. 创建任务函数​

在我们的trade应用的tasks.py文件中,我们定义一个名为batch_check_expired_time_orders的任务函数。该函数将获取所有未支付的订单,并遍历每个订单调用另一个函数check_order_expired来检查订单是否过期。我们使用异步方法delay来调用检查订单过期函数。

dx_movie/trade/tasks.py
from datetime import timedelta

from django.utils import timezone
from celery import shared_task

from .models import Order


@shared_task
def batch_check_expired_orders():
orders = Order.objects.filter(pay_status='PAYING')
for order in orders:
check_order_expired.delay(order.id)

2. 检查订单过期函数​

在我们的trade应用的tasks.py文件中,我们定义一个名为check_order_expired的函数,该函数将根据给定的订单ID来检查订单是否过期。我们使用订单的下单时间加上一个自定义的时间间隔来判断订单是否过期。如果订单过期,则将订单状态更改为已关闭,否则不做处理。

dx_movie/trade/tasks.py
from datetime import timedelta
from django.utils import timezone
from celery import shared_task
from .models import Order

@shared_task
def check_order_expired(order_id):
order = Order.objects.get(id=order_id)
expired_time = order.pay_time + timedelta(minutes=30)
if timezone.now() > expired_time:
order.pay_status = 'TRADE_CLOSED'
order.save()
return f'order {order.id} 过期,订单状态:close'
else:
return f'order {order.id}未过期,订单状态:paying'

@shared_task
def batch_check_expired_orders():
orders = Order.objects.filter(pay_status='PAYING')
for order in orders:
check_order_expired.delay(order.id)
🔒 试读结束

继续阅读完整内容

以上为免费预览。前往「Django + Vue 全栈课程」,查看后续完整讲解、案例演示和配套资料。

查看课程详情