Функция выполнения Django, когда DateTimeField равен текущей дате и времени - PullRequest
0 голосов
/ 12 октября 2018

Итак, я внедрил подписной продукт на свой сайт.

Когда они начинают подписку, текущая дата и время сохраняются в базе данных.Когда они отменяют подписку, к дате начала добавляется период времени, поэтому я знаю, когда отменить подписку и изменить некоторые значения в другом месте.

Это хорошо, я знаю, как использовать Django и Python, однакоЯ застрял на последнем бите, когда дата отмены наступит в будущем.

Вопрос: Как мне выполнить функцию, когда дата отмены (в дБ) равна текущейдата и время.

Ниже приведен простой пример модели, которую я буду использовать:

models.py

class Subscriptions(models.Model):
    subscription_id = models.AutoField(primary_key=True)
    start_date = model.DateTimeField(auto_now_add=True)
    cancel_date = model.DateTimeField(auto_now_add=False)
    person_id = model.ForeignKey('Persons')

class Persons(models.Model):
    person_id = models.AutoField(primary_key=True)
    value_to_change = models.BooleanField()

Прежде чем вы спросите, у меня нетпопытался любой код, так как я не мог найти решение этой проблемы.Спасибо <3 </p>

1 Ответ

0 голосов
/ 12 октября 2018

Без Celery, установлен в системе UNIX с CRON (cron doku: например, https://www.computerhope.com/unix/ucrontab.htm):

  1. , напишите команду https://docs.djangoproject.com/en/2.1/howto/custom-management-commands/, которая выбирает объекты, для которых отмена в прошлом, иэто еще не было отменено. (Если вы выполняете поиск с помощью datetime.now () (очень точного поиска с наилучшей детализацией), вам, возможно, будет повезло найти что-нибудь еще.)

Вы должны добавить еще одно поле даты, которое сообщит вам, когда система фактически выполнила отмену, и вы должны разрешить и cancel_date, и cancelled_date быть нулевыми.

class Subscriptions(models.Model):
    subscription_id = models.AutoField(primary_key=True)
    start_date = model.DateTimeField(auto_now_add=True)
    cancel_date = model.DateTimeField(auto_now_add=False, null=True)
    cancelled_date = model.DateTimeField(null=True)
    person_id = model.ForeignKey('Persons')

class CancellationCommand(BaseCommand):
    def handle(self, *args, **options):
        now = datetime.now()
        to_cancel_qs = Subscriptions.objects.exclude(
            cancelled_date__isnull=False).filter(
            cancel_date__lte=now)
        for sub in to_cancel_qs.all():
            # do your cancelling
            sub.cancelled_date = now
            sub.save()
        # or: to_cancel_qs.update(cancelled_date=now)
установить задание cron, которое запускает эту команду через ./manage.py your_command в обычное время
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...