【发布时间】:2020-03-06 16:18:03
【问题描述】:
我是一个初学者,我发现了很多东西,有时我对所有需要学习的信息和技巧感到不知所措。
我尝试为一家比萨店做一个 django 项目。人们可以在线订购披萨,订购方式很简单:您可以选择一个或多个披萨,还可以选择为您订购的每个披萨添加一些额外内容(添加奶酪、火腿或其他任何东西……),然后将其添加到购物车中。
我的问题是自动计算每个披萨的价格。
基本上这是我的模型文件:
class Pizza(models.Model):
nom = models.CharField(max_length=30)
ingrédients = models.CharField(max_length=500)
prix = models.DecimalField(max_digits=4, decimal_places=2)
nom 表示名称
class Extra(models.Model):
sup = models.CharField(max_length=30)
prix = models.DecimalField(max_digits=3, decimal_places=2)
sup 是额外的名称。
class IndividualChoice(models.Model):
pizzaChosen = models.ForeignKey(‘Pizza’, default="", null=True, on_delete=models.CASCADE)
extraChosen = models.ManyToManyField(‘Extra’, blank=True)
panier = models.ForeignKey(‘Cart’, default="", on_delete=models.CASCADE)
calzone = models.BooleanField(default=False)
prix = models.DecimalField(max_digits=5, decimal_places=2, default=0)
IndividualChoice 有点奇怪。这是一个存储每个选择的模型,这里的“panier”是指有模型的购物车,但我认为让它出现在这里没有用。
我对 django 信号有所了解,所以我尝试创建一个:
def prix_extra_calcul(sender, instance, action, *args, **kwargs):
instance.prix = 0
if action == “post_add” or action == “post_remove” or action == “post_clear”:
for extra in instance.extraChosen.all():
instance.prix += extra.prix
instance.prix += instance.pizzaChosen.prix
instance.save()
m2m_changed.connect(prix_extra_calcul, sender=IndividualChoice.extraChosen.through)
当我创建一个额外的披萨时效果很好,但如果只更改披萨,m2m 信号将不会被触发。 所以我试图找到另一种解决方案,但它很愚蠢:
def prix_pizza_calcul(sender, instance, *args, **kwargs):
instance.prix = 0
for extra in instance.extraChosen.all():
instance.prix += extra.prix
instance.prix += instance.pizzaChosen.prix
def prix_extra_calcul(sender, instance, action, *args, **kwargs):
if action == “post_add” or action == “post_remove” or action == “post_clear”:
# no need to write code because prix_pizza_calcul will be fired by instance.save()
instance.save()
pre_save.connect(prix_pizza_calcul, sender=IndividualChoice)
m2m_changed.connect(prix_extra_calcul, sender=IndividualChoice.extraChosen.through)
当我想修改一个选项时,第二种解决方案“效果很好”,但是当我创建一个新的披萨时,我收到了这个错误消息“调用 Python 对象时超出了最大递归深度”。我认为这是因为我正在循环一些未保存的内容。
我完全被这个问题所困扰,我试图解决它好几天。我应该创建一个信号,信号是否适合这种问题?
(成为一名网络开发人员真是太棒了……)
感谢阅读!
【问题讨论】:
标签: django django-models django-signals