Как я могу автоматически обновить два объекта в одной модели через 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, который вы запускаете на своем терминале.

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