Три модели:
- Пользователь
- Членство
- Приобретенное членство
Как приложение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