【问题标题】:Execute delete() within save() in Django在 Django 的 save() 中执行 delete()
【发布时间】: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 你能展示一下它是如何实现的吗?

标签: django model save sql-delete wagtail


【解决方案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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多