在Django中一段时间​​后更新模型字段

时间:2019-05-21 13:28:04

标签: python django model

我希望14天后自动更新模型中的字段状态。
这是我的模特。我想在15天后将 status_of_renting date_of_rental 更改为0(如果date.today()如果​​大于date_of_return)

class RentCatView(ListView):
    model = RentCar

    def get_queryset(self):
        self.model.objects.filter(Q(status_of_renting = 1)&Q(date_of_return__lte = date.today())).update(status_of_renting=0)
        return self.model.objects.all()

我可以在我的generic.ListView中覆盖 def get_queryset()调度,但我确信这是一个糟糕的决定。是否有更好的解决方案来更改字段 status_of_renting 中的状态。

views.py

$qrBuilder = $this->createQueryBuilder('p')
    ->select('p', 'i')
    ->leftJoin(IncomingInvoiceItem::class, 'i')
    ->where('i.outcomePrice > i.price');


$all = $qrBuilder->getQuery()->getResult();

1 个答案:

答案 0 :(得分:0)

尝试在queryset中更新数据库确实不是一个好主意-每当有人尝试获取RentCar的列表时都会执行该操作,这将污染您的数据库请求。

您需要设置cron作业来运行查询以更新RentCar。好消息是,您每天只能运行一次,因为只有status_of_renting才应该更改。

您可以使用django应用之一,例如django-crondjango-background-tasks

例如,这是您需要使用django-background-tasks做的事情:

from background_task import background
from .models import RentCar

@background(schedule=24*60*60)
def update_status_of_renting(user_id):
    RentCar.objects.filter(Q(status_of_renting = 1)&Q(date_of_return__lte = date.today())).update(status_of_renting=0)