繁体   English   中英

Django - 覆盖保存方法

[英]Django - override save method

我正在 Django 中覆盖模型的save()方法,但它无法正常工作。

我希望book_quantity在每次编辑购物车中的书籍数量并单击保存按钮时自动更新。

例如:

我已经将书的编号从 0 更改为 11 并单击了保存按钮,但book_quantity仍显示编号 0(前一个编号)。 如果我将数字从 11 更改为 22 或不更改数字,则再次单击保存按钮。 book_quantity将是 11。所以它总是显示前一个数字。 但是我想要的是,每次单击保存按钮(一次)时, book_quantity立即更改为正确的数字。

在此处输入图片说明

购物车/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

编辑:

我为什么要这样做,因为每次我将BooksInCart实例添加到购物车或从购物车中编辑/删除BooksInCart时,我都希望book_quantitytotal_price更新。 但是扩展save()方法是我想出的唯一想法。 有没有其他更好的方法来实现这一目标?

好吧,我不确定你的想法,但是,

也许你可以尝试使用信号? 每次更改数量时,它都会更改 book_quantity。 如:

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

同时,我同意这样的东西不需要存储在数据库中。

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

那么为什么不尝试将其保存在缓存中(尝试一下)或尝试您设计的其他解决方案?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM