Как я могу планировать задачи (с начальной и конечной датой) в Django, чтобы выполнить некоторые вычисления и сохранить их в базе данных? - PullRequest
0 голосов
/ 30 января 2019

Три модели:

  1. Пользователь
  2. Членство
  3. Приобретенное членство

Как приложениеworks

Каждое членство имеет дату начала и окончания.Пользователь может приобрести членство и его информацию, сохраненную в модели PurchaseasedMemebership.

Когда истекает дата членства (дата окончания больше текущей даты), затем подсчитайте каждое членство и сохраните подсчитанное значение в total_membership (поле модели PurchaseasedMemebership).

У меня есть 3 решения с проблемами

  • Делать вручную, когда встречается дата окончания членства, вызывать функцию execute_Calculations (request). (Делать вручную)
  • Увеличивать total_membership, зарегистрированное, когда пользователь приобрел членство.Будут возникать условия гонки.
  • Когда пользователь приобрел членство или просмотр членства, затем проверьте дату окончания и выполните расчет, но проблема в том, что каждый раз, когда пользователь просматривает членство после даты окончания, он будет выполнять дополнительную проверку (if-else).

Что я хочу

  • Нет проблем с производительностью.
  • Лучший способ решить эту проблему.
  • Как обрабатывать состояние гонки?
  • Как планировать задачи?
  • У любого пакета django без проблем со стабильностью?
  • Какое из моих решений хорошо и какэто может быть?

Django Models

Модель пользователя хранит информацию о пользователе.

class User(models.Model):
      #Django User Model 

Эта модель хранит данные о членстве.

class Membership(models.Model):
       title = models.CharField(max_length=100)
       start_date = models.DateTimeField(auto_now_add=True)
       end_date=  models.BooleanField(default=None)
       total_membership =  models.IntegerField(default=0)
       price = models.IntegerField(default=0)   
       PurchasedMembership = models.ManyToManyField(settings.AUTH_USER_MODEL,through='PurchasedMembership',through_fields=('Membership ', 'user'))

В этой модели хранятся сведения о приобретенном членстве.

class PurchasedMembership(models.Model):
        Membership = models.ForeignKey(Membership,on_delete=models.CASCADE) 
        user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, default="")
       joined_date = models.DateTimeField(auto_now_add=True)

       class Meta:
            unique_together = ('Membership ', 'user',)

Этот метод будет вызываться для выполнения некоторых вычислений и сохранения их в базе данных.

def perform_Calculations(request):
       #Performing calculations 

1 Ответ

0 голосов
/ 30 января 2019

Сельдерей - это как раз то, что вам нужно, когда у вас есть задачи, которые нужно выполнять периодически.

# tasks.py
@app.task
def check_membership_expired():
    # check if current_date >= expired_date

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

from celery.schedules import crontab

app.conf.beat_schedule = {
    # Executes every Monday morning at 7:30 a.m.
    'check_membership_expired-every-monday-morning': {
        'task': 'tasks.check_membership_expired',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
    },
}
...