在 Django 的 save() 中执行 delete()

Posted

技术标签:

【中文标题】在 Django 的 save() 中执行 delete()【英文标题】:Execute delete() within save() in Django 【发布时间】:2018-09-23 05:46:32 【问题描述】:

我正在做一个 Django/Wagtail 项目。我正在尝试构建一个非常自定义的功能,该功能需要在满足某些条件时点击“保存”按钮时删除对象。

我重写了 Save 方法:

def save(self, *args, **kwargs):

    if condition:
        return super(ArticleTag, self).delete()

    else:
        return super(ArticleTag, self).save(*args, **kwargs)

我知道这看起来很奇怪并且完全不明智,但这正是我想要实现的行为。

有没有更好或“正确”的方法来做到这一点?

是否有其他步骤可以准确重现行为,就像用户直接点击删除一样?

【问题讨论】:

如果你实现一个信号接收器应该是一个更好的解决方案。因为您没有在模型类中添加更多代码。 @Gytree 你能展示一下它是如何实现的吗? 【参考方案1】:

使用信号接收器

信号.py

from django.dispatch import receiver
from django.db.models.signals import post_save

__all__ = ['check_delete_condition']

@receiver(post_save, sender="yourapp.yourmodel")
def check_delete_condition(instance, raw, created, using, updatefields, **kwargs):
    if condition:
        instance.delete()

在你的apps.py中你不能把信号导入

from .signals import *

#rest of code

【讨论】:

【参考方案2】:

如果对象已经存在于你的数据库中,你可以这样做:

def save(self, *args, **kwargs):

    if condition:
        self.delete() # you do not need neither to return the deleted object nor to call the super method. 
    else:
        return super(ArticleTag, self).save(*args, **kwargs)

【讨论】:

这成功了!但我面临一个新问题,你会检查这个问题吗? ==> ***.com/questions/49824630/…

以上是关于在 Django 的 save() 中执行 delete()的主要内容,如果未能解决你的问题,请参考以下文章

在Django中一次提交中执行多个save()的最佳方法

何时在 django 中使用 pre_save、save、post_save?

Django中update和save()同时作用

Django信号调度

识别 django post_save 信号中更改的字段

django信号