在Django中覆盖保存方法时的无限循环
Posted
技术标签:
【中文标题】在Django中覆盖保存方法时的无限循环【英文标题】:infinite loop while overriding save method in Django 【发布时间】:2022-01-04 18:33:21 【问题描述】:我想重写保存方法以便
-
如果 cart_item 已经存在则更新数量
如果 cart_item 不存在,则插入新条目
但每次保存方法后它都会陷入无限循环
class Cart(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self) -> str:
return str(self.id)
class CartItem(models.Model):
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name='items')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
def __str__(self) -> str:
return self.product.name
def save(self, *args, **kwargs):
try:
cart_item = CartItem.objects.get(cart_id=self.cart.id, product_id=self.product.id)
cart_item.quantity += self.quantity
pprint(cart_item)
cart_item.save() #after this line goes into infinite loop
except CartItem.DoesNotExist:
super().save(*args, **kwargs) #after this line goes into infinite loop
pprint("-------------------------here")
``
【问题讨论】:
你考虑过使用objects.update_or_create
吗?
即使我使用 objects.update_or_create 方法。我仍然需要从上面的代码中做大部分事情,因为我必须使用新旧数据来计算数量。
【参考方案1】:
def save(self, *args, **kwargs):
if self._state.adding:
try:
cart_item = CartItem.objects.get(cart_id=self.cart.id, product_id=self.product.id)
quantity = cart_item.quantity + self.quantity
CartItem.objects.filter(pk=cart_item.id).update(quantity=quantity)
except CartItem.DoesNotExist:
super(CartItem, self).save(*args, **kwargs)
else:
super(CartItem, self).save(*args, **kwargs)
使用上面的代码,我可以实现我想要的。插入和更新都调用了 Save() 函数,我只想更改插入行为,所以为了检查正在执行的操作,我从 page 获得了帮助。如果我使用模型的 update() 方法进行更新,它不会进入无限循环ref。
【讨论】:
以上是关于在Django中覆盖保存方法时的无限循环的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?