在djang中使用Pre_delete信号

2024-05-15 23:17:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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信号来填充我创建的新表。

~新手正在尝试艰巨的任务~ 提前谢谢:)


Tags: of模型idtrue应用程序models记录delete
1条回答
网友
1楼 · 发布于 2024-05-15 23:17:22

首先定义要使用的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等)触发,而djangoapi没有与之关联的请求。因此,如果将用户与删除一起存储是绝对关键的,则可能希望避免使用信号。

相关问题 更多 >