Я использую сигнал для обновления полей в таблице профиля, когда новые инвестиции сделаны.
Используя несколько операторов print внутри функции update_users_investments, я вижу, что функция вызывается и выполняет правильные вычисления.
Тем не менее, он не сохраняется в базе данных, и нет ошибки.
Вы видите, почему это не экономит?И есть ли лучший способ отладки метода сохранения?Я оглянулся и ничего не вижу, и не зная почему это не экономит, очень расстраивает.
В другом месте моего кода я использую аналогичные сигналы для сохранения в других таблицах, которые работают нормально.
Сигнал
@receiver(post_save, sender=Investment)
def update_users_investments(sender, instance, created, **kwargs):
user = Profile.objects.get(user=instance.user.user)
total_investments = user.total_invested
investment = instance.transaction_type * instance.price * instance.number_shares
user.total_invested = total_investments + investment
user.save()
Модель для сохранения в:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
total_invested = models.DecimalField(max_digits=5, decimal_places=2)
cash_avaliable = models.DecimalField(max_digits=5, decimal_places=2,
null=True)
Модель инвестиций (откуда поступает сигнал):
class Investment(models.Model):
"""Model representing each investment made by users"""
user = models.ForeignKey(Profile, on_delete=models.DO_NOTHING)
team_code = models.ForeignKey(Team,
on_delete=models.DO_NOTHING)
transaction_type = models.IntegerField(choices=((-1, "Sell"), (1, "Buy")),
help_text="Show whether transaction\
was a buy or sell",
verbose_name="Transaction Type")
number_shares = models.IntegerField(help_text="Number of shares bought or \
sold in this transaction",
verbose_name="Number of Shares")
price = models.DecimalField(help_text = "Current Price of the team",
verbose_name = "Current Price", decimal_places=2, max_digits=5)
transaction_date = models.DateTimeField(auto_now=True, help_text="Date and \
Time of transaction",
verbose_name="Transaction Date")
transaction_mode = models.IntegerField(choices=((-1, "User Generated"),
(1,
"Automatically Generated")))
Редактировать
Решил эту проблему - как указано, user = Profile.objects.get (user = instance.user.user) не требуется.
@receiver(post_save, sender=Investment)
def update_users_investments(sender, instance, created, **kwargs):
total_investments = instance.user.total_invested
investment = instance.transaction_type * instance.price * instance.number_shares
instance.user.total_invested = total_investments + investment
instance.user.save()
Теперь появляется, чтобы заставить его работать: -)