我正在为Django中的模型覆盖save()
方法,但是它无法正常工作。
我希望book_quantity
每次在编辑购物车中的书本数量并单击保存按钮时自动更新。
例如:
我已经将书的编号从0更改为11,并单击了保存按钮,但是book_quantity
仍然显示数字0(先前的数字)。如果我将数字从11更改为22或不更改数字,请再次单击保存按钮。 book_quantity
将为11。因此,它始终显示前一个数字。但是我想要的是,每次单击保存按钮一次,book_quantity
都会立即更改为正确的数字。
购物车/模型.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
修改:
为什么要这样做,因为每次将book_quantity
实例添加到购物车或编辑/删除total_price
时,我都希望BooksInCart
和BooksInCart
进行更新从购物车中但是扩展save()
方法是我想到的唯一想法。还有其他更好的方法可以实现这一目标吗?
答案 0 :(得分:1)
好吧,我不确定你的想法,但是
也许您可以尝试使用信号?每次更改数量时,它都会更改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
同时,我同意不需要将这些内容存储在数据库中。
坦率地说,这种设计太糟糕了,当服务被很多人使用时会出现问题。
那么为什么不尝试将其保存在缓存中(也许尝试)还是尝试另一种设计方案呢?