Python Django-覆盖保存方法

Python Django-覆盖保存方法,python,django,Python,Django,我正在为Django中的模型重写save()方法,但它不能正常工作 我希望每次编辑购物车中的图书数量并单击“保存”按钮时,book\u数量会自动更新 例如: 我已经将书的编号从0更改为11,并单击了保存按钮,但book\u quantity仍显示编号0(以前的编号)。如果我将数字从11更改为22或不更改数字,请再次单击“保存”按钮。图书数量将为11。所以它总是显示前面的数字。但我想要的是每次单击“保存”按钮(一次)时,book\u数量会立即更改为正确的数字 cart/models.py cla

我正在为Django中的模型重写
save()
方法,但它不能正常工作

我希望每次编辑购物车中的图书数量并单击“保存”按钮时,
book\u数量
会自动更新

例如:

我已经将书的编号从0更改为11,并单击了保存按钮,但
book\u quantity
仍显示编号0(以前的编号)。如果我将数字从11更改为22或不更改数字,请再次单击“保存”按钮。
图书数量将为11。所以它总是显示前面的数字。但我想要的是每次单击“保存”按钮(一次)时,
book\u数量会立即更改为正确的数字

cart/models.py

class Cart(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
    book_quantity = models.IntegerField(default=0)
    total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)

    def __str__(self):
        return self.user.email + '_cart'

    def save(self, *args, **kwargs):
        self.book_quantity = 0
        books = BooksInCart.objects.filter(cart__user=self.user).values('quantity')
        for i in range(len(books)):
            self.book_quantity += books[i].get('quantity')
        super().save(*args, **kwargs)


class BooksInCart(models.Model):

    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)


    def __str__(self):
        return self.book.title
编辑:


为什么我这样做是因为我希望每次在购物车中添加
booksintat
实例或从购物车中编辑/删除
booksintat
时,
booksintat数量和
总价都会更新。但是扩展
save()
方法是我想到的唯一想法。还有其他更好的方法吗?

嗯,我不确定你的想法,但是

也许你可以试着用信号?每次你的数量改变时,它都会改变账面数量。例如:

from django.db.models.signals import post_save

@receiver(post_save, sender=BooksInCart) # the sender is your fix
def update_book_quantity(sender, instance, **kwargs):
    book_quantity = 0
    books = BooksInCart.objects.filter(cart=instance.cart).values('quantity')
    for item in book.iterator():
        book_quantity += item.get('quantity')
    instance.update(book_quantity=book_quantity)
    # TODO
同时,我同意这些东西不需要存储在数据库中。

坦率地说,这种设计很糟糕,当很多人使用该服务时,它会出现问题


因此,为什么不尝试将其保存在缓存中(也许可以尝试),或者尝试您设计的其他解决方案?

刷新页面?不要这样做
.save()
可能会被绕过。例如,使用
Cart.objects.update(..)
。您可以在这里使用聚合来快速计算图表中图书的数量。您的购物车模型中不需要图书数量字段。book_quantity保存着一个简单计算的结果,这些东西不需要存储在数据库中。@WillemVanOnsem抱歉不知道怎么做,请你解释一下好吗?@e4c5是的,也许你是对的,但我仍然需要对总价做同样的事情。如何使“总价”字段自动更新?实际上,我想要的是每次创建BooksInvestment实例或编辑或删除BooksInvestment实例时,book\u数量都会自动更新(或初始化)。但是扩展一个保存方法是我唯一想到的。@Jinx我建议你可以试试这种方法。唯一需要添加的是post_delete的相同函数,或者只是在self.cart.save()之后过度使用booksett的save函数(与signal的逻辑相同)。