Как автоматически обновлять/вставлять запрос в базу данных в 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()
Но это может быть не самой лучшей идеей, потому что книга может быть возвращена с опозданием, и тогда ваш подсчет будет нарушен.