【问题标题】:Django overriden model save method returning old dataDjango覆盖模型保存方法返回旧数据
【发布时间】:2020-08-07 13:35:40
【问题描述】:

我可能累了,看不到东西,但我尝试了太多。

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,没有别的。

【问题讨论】:

  • 所以在 self.price = base_pizza.price 你有正确的金额,但在 self.calculate_price() 你得到旧号码?
  • 在 self.price = base.pizza.price 我有错误的价格,因为 self.toppings.count() 正在存储上次保存的信息。示例:如果我第一次使用 2 个浇头保存模型,self.toppings.count() 将等于 0,如果我更改它并再次保存,self.toppings.count() 将为 2。

标签: django django-models many-to-many overriding django-orm


【解决方案1】:

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

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

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2016-03-17
    相关资源
    最近更新 更多