Oli*_*mbs 5 django django-signals django-models
当进行新投资时,我使用信号来更新配置文件表中的字段。
在 update_users_investments 函数中使用了许多打印语句后,我可以看到该函数正在被调用并且正在执行正确的计算。
但是,它没有保存到数据库,也没有错误。
你能明白为什么它不保存吗?还有更好的方法来调试 save 方法吗?我环顾四周,看不到任何东西,不知道为什么它没有保存,这非常令人沮丧。
在我的代码的其他地方,我使用类似的信号保存到看起来工作正常的其他表。
信号
@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()
Run Code Online (Sandbox Code Playgroud)
要保存的模型:
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)
Run Code Online (Sandbox Code Playgroud)
投资模型(信号的来源):
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")))
Run Code Online (Sandbox Code Playgroud)
已经解决了这个问题 - 正如所指出的那样,不需要 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()
Run Code Online (Sandbox Code Playgroud)
现在似乎可以正常工作了:-)
我遇到了同样的问题,所有调试打印看起来都是正确的,但我无法获取数据集。
\n\n根据https://realpython.com/modeling-polymorphism-django-python/:
\n\n“您使用Django\xe2\x80\x99s 内置验证机制来强制执行数据完整性规则。clean() 仅由 Django 表单自动调用。对于不是由 Django 表单创建的对象,您需要确保显式验证该对象。”
\n\n我尝试直接保存到字段并在视图中使用 save() 以及在模型中使用方法。例如:
\n\ndef set_date_paid(self,date_str):\n self.date_paid = date_str\nRun Code Online (Sandbox Code Playgroud)\n\n使用这种方法,我仍然在调用该方法的视图中执行 save() 。我决定在模型方法中保存字段,例如:
\n\ndef set_date_paid(self,date_str):\n self.date_paid = date_str\n self.save(update_fields=["date_paid"])\nRun Code Online (Sandbox Code Playgroud)\n\n结果我终于得到了一个错误,我的数据无效。
\n\n我的错误是我期望得到验证错误。但正如文章和手册所指出的,事实并非如此。
\n\n了解这一点后,我确保将数据筛选为正确的格式,并且数据保存得很好。我还没有回去在视图中执行 save() 操作,但我仍然坚持从模型中进行工作,即使对于单个字段更新也是如此。我还不是很“Pythonic”,所以我确信有更好的方法,但我希望这对你有帮助。
\n| 归档时间: |
|
| 查看次数: |
12790 次 |
| 最近记录: |