Как я могу планировать задачи (с начальной и конечной датой) в Django, чтобы выполнить некоторые вычисления и сохранить их в базе данных?
Три модели:
- пользователь
- членство
- PurchasedMembership
Как работает приложение
Каждое членство имеет дату начала и окончания. Пользователь может приобрести членство и его информацию, хранящуюся в модели PurchaseagedMemebership.
Когда дата членства истекает (дата окончания больше текущей даты), подсчитайте каждое членство и сохраните подсчитанное значение в total_membership (поле модели PurchaseasedMemebership).
У меня есть 3 решения с проблемами
- Делать вручную, когда встречается дата окончания членства, вызывать функцию execute_Calculations(request).(Делать вручную)
- Увеличивать total_membership, регистрируемый, когда пользователь приобрел членство. Гонка условие будет происходить.
- Когда пользователь приобрел членство или просмотр членства, проверьте дату окончания и выполните расчет, но проблема в том, что каждый раз, когда пользователь просматривает членство после даты окончания, он будет выполнять дополнительную проверку (если-еще).
Что я хочу
- Нет проблем с производительностью.
- Лучший способ решить эту проблему.
- Как справиться с состоянием гонки?
- Как планировать задачи?
- Любой пакет django без проблем со стабильностью?
- Какое из моих решений хорошо и как оно может быть?
Джанго Моделс
Модель пользователя хранит информацию о пользователе.
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 ответ
Сельдерей - это как раз то, что вам нужно, когда у вас есть задачи, которые нужно делать периодически.
# 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),
},
}