在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中覆盖保存方法时的无限循环的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 initWithCoder 时的无限循环

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

在 componentWillReceiveProps 中调度时的无限循环

确定文件大小时的Python无限循环

从文件读取数据时的无限循环

在c ++ 11中使用异常时的无限循环