我如何在 Django 中安排任务(开始日期和结束日期)来执行一些计算并将它们保存到数据库中?
How i can Schedule tasks (with starting date and ending date) in django to perform some calculation and save them into database?
三个型号:
- 用户
- 会员资格
- 已购买的会员资格
应用程序如何工作
每个会员都有开始日期和结束日期。用户可以购买会员资格并将其信息存储到 PurchasedMemebership 模型中。
当会员日期到期时(结束日期大于当前日期),然后计算每个会员并将计算的值存储到 total_membership(PurchasedMemebership 模型字段)。
我有 3 个问题的解决方案
- 当会员资格结束日期满足时手动点赞
perform_Calculations(请求)功能。(手动执行)
- 在用户购买会员时增加 total_membership 归档。将出现竞争条件。
- 当用户购买会员资格或查看会员资格然后检查结束日期并执行计算但问题是每次用户在结束日期之后查看会员资格时都会执行额外检查(if-else)。
我想要什么
- 没有性能问题。
- 解决此问题的最佳方法。
- 如何处理竞争条件?
- 如何安排任务?
- 任何没有稳定性问题的 django 包?
- 我的解决方案哪个好,如何?
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
当您有需要定期完成的任务时,Celery 正是您所需要的。
# tasks.py
@app.task
def check_membership_expired():
# check if current_date >= expired_date
您可以安排此任务,以便每隔 hour/night/day 调用一次。
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),
},
}
三个型号:
- 用户
- 会员资格
- 已购买的会员资格
应用程序如何工作
每个会员都有开始日期和结束日期。用户可以购买会员资格并将其信息存储到 PurchasedMemebership 模型中。
当会员日期到期时(结束日期大于当前日期),然后计算每个会员并将计算的值存储到 total_membership(PurchasedMemebership 模型字段)。
我有 3 个问题的解决方案
- 当会员资格结束日期满足时手动点赞 perform_Calculations(请求)功能。(手动执行)
- 在用户购买会员时增加 total_membership 归档。将出现竞争条件。
- 当用户购买会员资格或查看会员资格然后检查结束日期并执行计算但问题是每次用户在结束日期之后查看会员资格时都会执行额外检查(if-else)。
我想要什么
- 没有性能问题。
- 解决此问题的最佳方法。
- 如何处理竞争条件?
- 如何安排任务?
- 任何没有稳定性问题的 django 包?
- 我的解决方案哪个好,如何?
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
当您有需要定期完成的任务时,Celery 正是您所需要的。
# tasks.py
@app.task
def check_membership_expired():
# check if current_date >= expired_date
您可以安排此任务,以便每隔 hour/night/day 调用一次。
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),
},
}