在 Django 的 save() 中执行 delete()
Execute delete() within save() in Django
我正在做一个 Django/Wagtail 项目。我正在尝试构建一个非常自定义的功能,该功能需要在满足特定条件时点击“保存”按钮时删除对象。
我覆盖了保存方法:
def save(self, *args, **kwargs):
if condition:
return super(ArticleTag, self).delete()
else:
return super(ArticleTag, self).save(*args, **kwargs)
我知道这看起来很奇怪而且完全不可取,但这正是我想要实现的行为。
是否有更好的或 "correct" 方法来做到这一点?
是否有其他步骤可以准确重现该行为,就像用户直接点击删除一样?
如果对象已经存在于你的数据库中,你可以这样做:
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)
使用信号接收器
signals.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
我正在做一个 Django/Wagtail 项目。我正在尝试构建一个非常自定义的功能,该功能需要在满足特定条件时点击“保存”按钮时删除对象。
我覆盖了保存方法:
def save(self, *args, **kwargs):
if condition:
return super(ArticleTag, self).delete()
else:
return super(ArticleTag, self).save(*args, **kwargs)
我知道这看起来很奇怪而且完全不可取,但这正是我想要实现的行为。
是否有更好的或 "correct" 方法来做到这一点?
是否有其他步骤可以准确重现该行为,就像用户直接点击删除一样?
如果对象已经存在于你的数据库中,你可以这样做:
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)
使用信号接收器
signals.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