在 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()的主要内容,如果未能解决你的问题,请参考以下文章