【发布时间】: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