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()

Вернуться на верх