在 django 中使用 Pre_delete 信号

Posted

技术标签:

【中文标题】在 django 中使用 Pre_delete 信号【英文标题】:Using Pre_delete Signal in django 【发布时间】:2012-12-01 04:12:24 【问题描述】:

在我的应用程序中,我想跟踪所有被删除的问题。所以我在我的模型文件中创建了一个类(表)。

class Deleted(models.Model):
question = models.IntegerField(null=True, blank=True)#id of question being deleted
user = models.IntegerField(null=True, blank=True)#id of user deleting the question
dt = models.DateTimeField(null=True, blank=True)#time question is deleted

当用户尝试删除问题时调用此删除函数:

def delete_questions(request, user, questions):
  for q in questions:
        q.delete()

我的疑问是如何制作 django 的 pre_delete 信号来填充我创建的新表。

~新手尝试艰巨的任务~ 在此先感谢:)

【问题讨论】:

您到底遇到了什么问题?您是否阅读过有关信号的文档? docs.djangoproject.com/en/dev/topics/signals 【参考方案1】:

您首先定义要使用的receiver:

def log_deleted_question(sender, instance, using, **kwargs):
    d = Deleted()
    d.question = instance.id
    d.dt = datetime.datetime.now() # consider using auto_now=True in your Deleted definition
    # not sure how you'd get the user via a signal, 
    # since it can happen from a number of places (like the command line)
    d.save()

然后定义你的接收器装饰器:

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

@receiver(pre_delete, sender=Question, dispatch_uid='question_delete_log')

全部添加:

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

@receiver(pre_delete, sender=Question, dispatch_uid='question_delete_signal')
def log_deleted_question(sender, instance, using, **kwargs):
    d = Deleted()
    d.question = instance.id
    d.dt = datetime.datetime.now() 
    d.save()

您可以将此函数放入您的models.py 文件中,因为您知道它将被正确加载和连接。

但问题是您没有让用户请求删除。由于可以从 django api(命令行、shell 等)触发删除,它没有与之关联的请求。出于这个原因,如果将用户与删除一起存储绝对至关重要,那么您可能希望避免使用信号。

【讨论】:

感谢您的回答:) 但是@Josh 我放置的“已删除类”是我新创建的表,以便它们可以填充值,我对此有麻烦。你说的看起来很好,试过了,但它说不能从 django.core.signals import pre_delete 导入所以我尝试从 django.db.models.signals import pre_delete 导入。然后它再次抱怨无法导入接收器..尝试谷歌搜索但正如那里所建议的那样,我无法更改或删除其他版本的 django.. 任何解决方法吗?还有一个关于用户 ID 的疑问,我们不能使用(提供 args) 回复:特定用户,我用谷歌搜索希望得到一些答案并绕过这个***.com/questions/6847952/….. 试图弄清楚它如何适合我的上下文:) 我正在使用 Django 1.2,所以 reg 出现问题。 imrting 接收者。我通过使用 post_delete.connect(my_callback_func, sender=mymodel) 克服了这个问题但是我无法获取删除的用户,你能帮我保释吗:) @TheRecruit,您无法确定删除信号中对象的用户;该信息不可用。 @TheRecruit,你可能有一个导入循环。模型.py 正在导入信号.py,它正在导入模型.py....我知道这是一个古老的问题,但我想我会为那些偶然发现它的人发表评论。

以上是关于在 django 中使用 Pre_delete 信号的主要内容,如果未能解决你的问题,请参考以下文章

Django 信号

django 信号

django内置组件

django(12)信号

如何将 Django 信号与抽象模型一起使用?

使用Django实现微信公众号用户openid登录认证