首页 > 解决方案 > 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,没有别的。

标签: djangodjango-modelsmany-to-manyoverridingdjango-orm

解决方案


这个问题的答案在这里:https ://docs.djangoproject.com/en/3.0/ref/signals/#m2m-changed

保存模型后保存多对多关系。所以我建立了一个信号来解决这个问题。

谢谢您的帮助!


推荐阅读