Как автоматически обновлять/вставлять запрос в базу данных в django

Это электронная библиотечная система. Когда дата окончания_заимствования истекла, статус заимствования будет автоматически обновлен до 1 (Окончание), столбец таблицы "Книжный фонд" будет обновлен, добавляя один фонд, и автоматически вставляя новое значение содержания в таблицу уведомлений.

class Borrow(models.Model):
status = models.CharField(max_length=1, choices=[('0', 'Process'),('1', 'End')], default=0)
book = models.ForeignKey('models.Book', on_delete=models.CASCADE, related_name='borrow_book')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
end_date = models.DateTimeField()
    
class Book(models.Model):
stock = models.IntegerField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Notification(models.Model):
content = models.CharField(max_length=255, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

Как сделать запрос на автоматическое обновление в таблице borrow столбца status, таблице book столбца stock, и вставку в таблицу notification when end_date > DateTime.now() ?

Я бы сделал команду управления, а затем создал Cron / запланированную задачу для ее почасового запуска.
Существуют пакеты django-crontab и django-cron, которые также могут это сделать (я полагаю?), но я никогда не использовал ни один из них и придерживался старого дефолтного кронтаба Linux

Примечание: я забыл создать уведомление

Команда управления

from django.core.management.base import BaseCommand
from django.core.management import call_command

class Command(BaseCommand):
    help = 'Ran Hourly With a Cron'

    def handle(self, *args, **kwargs):
        from app.models import Barrow
        from datetime import datetime

        # Fetch List
        l = Borrow.objects.filter(status='0', end_date__lte=datetime.now())

        # Update stock
        #   F() means you don't need to fetch the value to update it!
        from django.db.models import F
        for i in l:
            b = i.book
            b.stock += F('stock') + 1
            b.save()

        # update List
        l.update(status='1')

Вероятно, это был бы лучший способ обновить счетчик, особенно если есть несколько курганов для одной книги.

from django.db.models import Count
for i in l.values('book').annotate(count=Count('pk')):
    # i = { 'book': {book__pk}, 'count': total_int }
    b = Book.objects.get(pk=i['book'])
    b.stock += F('stock') + i['count']
    b.save()

Но это может быть не самой лучшей идеей, потому что книга может быть возвращена с опозданием, и тогда ваш подсчет будет нарушен.

Вернуться на верх