问题描述
我目前正在开发一个 Django 博客应用程序,我有一个 Post
连接到一个 Category
。 Category
具有 name
和 times_used
字段。创建帖子后,times_used
将增加 1,我已经实现了这一点,覆盖了 save()
模型上的 Post
方法。我正在尝试覆盖 delete()
方法以将当前帖子的类别减少 1,但它实际上并没有达到似乎被覆盖的 delete()
方法,因为即使在帖子获得之后,该类别仍然具有增加的值删除。请参阅下面的代码...
model.py
class Category(models.Model):
name = models.CharField(max_length=150,unique=True)
times_used = models.IntegerField(default=0)
class Post(models.Model):
category = models.ForeignKey(Category,on_delete=models.CASCADE)
# This increments this category by 1 then saves the post - Works well!
def save(self,*args,**kwargs):
self.category.times_used += 1
self.category.save()
super(Post,self).save(*args,**kwargs)
# This decrements this category by 1 then deletes the post - Which is not working...
def delete(self,**kwargs):
self.category.times_used -= 1
self.category.save()
super(Post,self).delete(*args,**kwargs)
对如何实现这一点有什么建议吗?
解决方法
你可以像这样使用 pre_delete 信号来做到这一点
@receiver(pre_delete,sender=Post)
def my_handler(sender,instance,**kwargs):
instance.category.times_used -= 1
instance.category.save()
,
我刚刚阅读了关于 Django 信号的文章,并且已经完成了我想要的。根据 Django documentation... 当我们覆盖它以使用 QuerySet 批量删除对象时,不会调用 delete() 方法。所以最好使用信号来完成这些类型的工作。
在我的 models.py
中,我将 Post
作为参数传递给我在 signals.py
中创建的函数
models.py
class Post(models.Model):
....
delete_post_signal(Post)
在我的 signals.py
中,我有以下代码...
from django.dispatch import receiver
from django.db.models.signals import pre_delete
def delete_post_signal(Post):
@receiver(pre_delete,sender=Post)
def decrement_category_usage(sender,**kwargs):
instance.category.times_used -= 1
instance.category.save()
这对我来说非常有效......