微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 模型删除方法没有覆盖

如何解决Django 模型删除方法没有覆盖

我目前正在开发一个 Django 博客应用程序,我有一个 Post 连接到一个 CategoryCategory 具有 nametimes_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()

这对我来说非常有效......

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。