Django添加signals信号记录操作日志

文章描述了如何在Django应用中使用`post_save`和`post_delete`信号来自动创建和删除`OperationLog`模型,记录对数据库中模型实例的操作,包括创建、更新和删除,以及如何处理`account`字段。
摘要由CSDN通过智能技术生成
models.py

class OperationLog(models.Model):
    model_name = models.CharField(max_length=100)
    operation = models.CharField(max_length=100)
    object_id = models.PositiveIntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    account = models.CharField(max_length=100, default='anonymous')

    def __str__(self):
        return f"{self.model_name} - {self.operation} - ID: {self.object_id}"


from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
@receiver(post_save)
def create_operation_log(sender, instance=None, created=False, **kwargs):
    if sender == OperationLog:
        # 避免记录操作日志时出现循环调用
        return

    if created:
        operation = 'create'
    else:
        operation = 'update'
    # 解决报错 AttributeError: 'Migration' object has no attribute 'account'
    if 'makemigrations' not in sys.argv and 'migrate' not in sys.argv:
        OperationLog.objects.create(
            model_name=sender._meta.model_name,
            operation=operation,
            object_id=instance.id,
            account=instance.account
        )

@receiver(post_delete)
def delete_operation_log(sender, instance=None, **kwargs):
    if sender == OperationLog:
        # 避免记录操作日志时出现循环调用
        return
    # 解决报错 AttributeError: 'Migration' object has no attribute 'account'
    if 'makemigrations' not in sys.argv and 'migrate' not in sys.argv:
        OperationLog.objects.create(
            model_name=sender._meta.model_name,
            operation='delete',
            object_id=instance.id,
            account=instance.account
        )

其他表的字段默认包含id,如果需要记录其他字段,比如account,即操作人,那么需要每个表都有account字段就可以,比如这种:

class ImageUpload(models.Model):
    sid = models.CharField(max_length=64, default=uuid.uuid4().hex)  # ID
    image = models.ImageField(upload_to='xxx/', default='xxx/default.png')  # 文件
    account = models.CharField(max_length=50, default='admin')  # 更新用户
    update_time = models.DateTimeField(auto_now=True)  # 更新时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lytcreate.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值