Django save()方法没有保存

时间:2018-06-10 09:56:58

标签: django django-models django-signals

我正在使用信号在新投资时更新配置文件表中的字段。

在update_users_investments函数中使用了许多print语句后,我可以看到正在调用该函数,并且它正在进行正确的计算。

但是,它没有保存到数据库,也没有错误。

你能明白为什么不能保存吗?有没有更好的方法来调试保存方法?我环顾四周,看不到任何东西,不知道为什么它不是拯救非常令人沮丧。

在我的代码的其他地方,我使用类似的信号保存到其他似乎工作正常的表。

信号

@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")))

修改

解决了这个问题 - 正如所指出的那样,用户= 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()

现在似乎可以使它工作: - )

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我所有的调试打印看起来都正确,但是我无法获得数据集。

根据https://realpython.com/modeling-polymorphism-django-python/

“您使用Django’s built-in validation mechanism来执行数据完整性规则。clean()仅由Django表单自动调用。对于不是由Django表单创建的对象,您需要确保明确验证该对象。 “

我尝试了直接保存到字段,在视图中使用save()以及在模型中使用方法。例如:

def set_date_paid(self,date_str):
    self.date_paid = date_str

使用这种方法,我仍然在调用该方法的视图中执行save()。我决定在模型的方法中保存字段,例如:

def set_date_paid(self,date_str):
    self.date_paid = date_str
    self.save(update_fields=["date_paid"])

结果是我终于得到一个错误,表明我的数据无效。

我的错误是我希望收到验证错误。但是正如文章和手册所指出的,情况并非如此。

一旦我知道了这一点,我就确保将数据筛选为正确的格式,并且数据保存良好。我还没有回到在视图中执行save()的问题,但是即使在单个字段更新时,我仍然坚持使用模型进行工作。我还不是很“ pythonic”,所以我确定有更好的方法,但是希望对您有帮助。