0

三种型号:

  1. 用户
  2. 会员资格
  3. 购买会员

应用程序如何工作

每个成员都有开始日期和结束日期。用户可以购买存储在 PurchasedMemebership 模型中的会员资格及其信息。

当会员日期到期(结束日期大于当前日期)时,计算每个会员并将计数值存储到 total_membership(PurchasedMemebership 模型字段)。

我有 3 个有问题的解决方案

  • 像会员结束日期一样手动执行调用 perform_Calculations(request) 函数。(手动执行)
  • 增加用户购买会员时提交的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 
4

1 回答 1

1

当您有需要定期完成的任务时,Celery 正是您所需要的。

# 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),
    },
}
于 2019-01-30T07:35:58.330 回答