13

私のアプリでは、削除されているすべての質問を追跡したいと考えています。そのため、モデルファイルにクラス(テーブル)を作成しました。

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 シグナルを作成して、作成した新しいテーブルにデータを入力する方法です。

〜初心者が多額のタスクを試みています〜 前もって感謝します:)

4

1 に答える 1

41

使用するレシーバーを定義することから始めます。

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(コマンドライン、シェルなど)からトリガーできるため、それに関連付けられたリクエストはありません。このため、削除とともにユーザーを保存することが絶対に重要な場合は、シグナルの使用を避けた方がよい場合があります。

于 2012-12-13T10:41:11.240 に答える