Обновление поля модели через некоторое время в Джанго - PullRequest
0 голосов
/ 21 мая 2019

Я хочу автоматически обновлять статус поля в моей модели через 14 дней.
Вот моя модель.Я хочу изменить status_of_renting на 0 через 15 дней с date_of_rental (если date.today (), если больше чем date_of_return)

class RentCar(models.Model):
    NORMAL = 1
    PENALTY = 0 

    STATUS = (
        (NORMAL, 'All is fine'),
        (PENALTY, 'Penalty for using car')
    )

    car = models.ForeignKey('Car', on_delete = models.CASCADE, related_name = 'car')
    person = models.ForeignKey('Person', on_delete = models.CASCADE, related_name = 'client')
    date_of_rental = models.DateField(blank= True, default=timezone.now)
    date_of_return = models.DateField(blank= True, default=date.today() + timedelta(days=14))
    status_of_renting = models.IntegerField(choices = STATUS, default = 1)

    def __str__(self):
        return f'{self.rental} - {self.car} / {self.client.fullname}'

Я могу переопределить def get_queryset () или dispatch в моем generics.ListView, но я уверен, что это ужасное решение.Есть ли лучшее решение для изменения статуса в поле status_of_renting .

views.py

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()

1 Ответ

0 голосов
/ 21 мая 2019

Попытка обновить базу данных в наборе запросов - действительно плохая идея - она ​​будет выполняться каждый раз, когда кто-то пытается получить список RentCar, который загрязнит вашу базу данных запросами.

Вам нужно настроить задание cron, чтобы выполнить запрос на обновление RentCar. Хорошо, что вы можете запускать его только один раз в день, поскольку status_of_renting нужно изменить только раз.

Вы можете использовать одно из приложений django, например, django-cron или django-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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...