Django: Как остановить увеличение значения при обновлении страницы в Django?
У меня есть два некоторых поля в моей модели профиля, которые называются:
class Profile(models.Model):
...
main_all_earning = models.IntegerField(default=0)
earning_point = models.IntegerField(default=0)
referral_point = models.IntegerField(default=0)
indirect_sign_up = models.IntegerField(default=0)
и у меня также есть логика в views.py
def profile(request):
...
user = request.user
profile = request.user.profile
my_count = Profile.objects.filter(recommended_by__profile__recommended_by=user).count()
profile.indirect_sign_up = my_count * signup_point.ind_signup_point
profile.main_all_earning = profile.main_all_earning + profile.indirect_sign_up
profile.save()
Теперь всякий раз, когда я вызываю это представление профиля, main_all_earning
добавляет все, что находится в indirect_sign_up
и дает новое значение и так далее...
Как это остановить? Я хочу, чтобы main_all_earning
добавлял все, что находится в indirect_sign_up
только один раз и пока не появится новое значение в indirect_sign_up
, а не каждый раз, когда я обновляю страницу
Вы можете просто проверить если значение indirect_sign_up
изменится:
def profile(request):
...
user = request.user
profile = user.profile
my_count = Profile.objects.filter(recommended_by__profile__recommended_by=user).count()
temp_indirect_sign_up = my_count * signup_point.ind_signup_point
if profile.indirect_sign_up != temp_indirect_sign_up:
profile.indirect_sign_up = temp_indirect_sign_up
profile.main_all_earning = profile.main_all_earning + profile.indirect_sign_up
profile.save()
ИМХО, вам следует выполнять обновление подсчета при обновлении модели профиля пользователя. Каждый раз, когда происходит изменение в поле indirect_sign_up, запускайте код обновления подсчета. Обновление подсчета только при посещении профиля может привести к неправильному подсчету пользователей. По моему мнению, наилучшее размещение может быть в точке, где происходит обновление indirect_ref_signup
.
Иначе, сигналы могут работать лучше для вас. Мы можем работать над сигналом pre_save
для этого обновления счета:
- проверить, является ли это сигналом сохранения, а не создания
- проверить, изменился ли текущий
indirect_ref_signup
# signals.py
from django.db.models.signals import post_save, pre_delete,pre_save
from django.dispatch import receiver
from .models import Profile
@receiver(pre_save, sender=Profile)
def update_indirect_signup_count(sender, instance, **kwargs):
if instance.id is None:
# this is on create event
pass
else:
current=instance
previous=Profile.objects.get(id=instance.id)
if previous.indirect_sign_up!= current.indirect_sign_up:
# update code here
# save the instance
instance.save()