Как я могу автоматически обновить два объекта в одной модели через 7 дней на Django?
У меня есть 2 модели, которые я хочу взаимодействовать/обновлять каждые 7 дней без необходимости моего выполнения. (независимо от того, онлайн или оффлайн сайт) (пока локальный хостинг).
class Model: name = model... количество = models.IntegerField(default=0)
obj A имя = A количество = 0
obj B имя = B количество = 1,000,000
Я пытаюсь найти способ переводить 1000 из объекта B в объект A, каждые 7 дней.
Я ищу, но все еще не могу найти ответ, который упрощает эту ситуацию.
Спасибо за помощь!
Я еще ничего не пробовал, так как не знаю, с чего начать. Я знаю, как обновлять объекты вручную, при загрузке страницы или с помощью сигналов.
возможно, это как-то связано с DateTime, но я не уверен. В настоящее время в модели нет поля даты.
Или сельдерей, но я никогда не использовал его раньше.
Есть несколько способов сделать это. Для минимизации кривой обучения, возможно, использование crontab и создание команды django-admin
будет хорошим путем для начала:
# <YOUR_APP>/management/commands/transfer.py
from django.core.management.base import BaseCommand
from django.db import transaction
from <YOUR_APP>.models import MyModel
class Command(BaseCommand):
help = "Transfer one million copies from Obj B to A of MyModel"
def add_arguments(self, parser):
parser.add_argument("--quantity", type=int, default=1000)
def handle(self, *args, **options):
a = MyModel.objects.get(name="A")
b = MyModel.objects.get(name="B")
quantity = options["quantity"]
with transaction.atomic():
a.quantity += quantity
a.save()
b.quantity -= quantity
b.save()
Тогда вы можете выполнить:
python manage.py transfer
для передачи вашего количества.
Далее следует автоматизация. Запустите crontab -e
и добавьте одну строку:
0 4 * * 0 /usr/bin/python <REPLACE_IT_WITH_YOUR_DJANGO_PROJECT_PATH>/manage.py transfer
0 4 * * 0
означает, что crontab будет пытаться выполнить эту команду в 04:00 каждое воскресенье - вы можете проверить и настроить это выражение на Crontab.guru.
Возможно, вы используете virutalenv вместо интерпретатора Python системного уровня для запуска кода вашего приложения. Если это так, то вам следует заменить /usr/bin/python
на результат which python
, который вы запускаете на своем терминале.