django - Django覆盖模型保存方法返回旧数据
问题描述
我可能累了,我什么也没看到,但我已经尝试了太多。
class Pizza(models.Model):
portion_size = models.ForeignKey('PortionSize', on_delete=models.PROTECT)
pizza_type = models.ForeignKey('PizzaType', on_delete=models.PROTECT)
toppings = models.ManyToManyField('Topping', blank=True)
special = models.BooleanField()
price = models.DecimalField(
max_digits=4, decimal_places=2, editable=False, default=0
)
def calculate_price(self, topping_amount):
print(self.toppings.count())
topping_amount = self.toppings.count()
base_pizza = PizzaBase.objects.get(
portion_size=self.portion_size, pizza_type=self.pizza_type,
special=self.special, topping_amount=topping_amount
)
self.price = base_pizza.price
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.calculate_price()
这是我为 Django 定义的模型,我试图设置用户保存表单时创建的比萨饼的价格,但每次运行代码时,toppings.count 值总是落后。
例如,如果我选择了三个浇头,并且在将表单保存在管理面板中之前,只选择了两个浇头,我将得到两个浇头的计算价格。我试过改变保存方法的顺序,但它没有改变任何东西。我还使用 shell 检查是否有问题,但是在 Django shell 中,浇头计数一切正常。我还检查了管理界面,多次刷新,清除缓存,一切似乎都很好。
我已经启动 Signals 来解决这个问题。为 post_save() 信号创建接收器,但尚未完全测试它。
有谁知道可能会发生什么?我在本地运行这段代码,使用 SQLite,应用程序仍在开发中,我只使用 VSCode,没有别的。
解决方案
这个问题的答案在这里:https ://docs.djangoproject.com/en/3.0/ref/signals/#m2m-changed
保存模型后保存多对多关系。所以我建立了一个信号来解决这个问题。
谢谢您的帮助!
推荐阅读
- powershell - 当我的命令的第一个单词是扩展的变量时,Powershell 错误
- java - 活动崩溃,因为 ListAdapter 等于 null
- java - 一个链表可以有多个头节点吗?
- python - 蓝牙 (bluepy) 在 GATT 通知期间断开连接
- ios - 检测用户是否正在触摸 SKShapeNode
- java - K 表示距离 - Java
- php - 如何使用 Laravel 5.5 在 jQuery 中使用 @lang?
- ios - Protocol 'Line' 只能用作通用约束,因为它具有 Self 或关联的类型要求
- math - 如何获取.net DrawArc 方法的弧长
- excel - 具有可变行数的 VBA Sum 列