from django.db import models from django.utils import timezone class OperationLog(models.Model): OPERATION_LEVELS = ( ('view', '查看'), ('update', '更新'), ('new', '新增'), ('delete', '删除'), ('download', '下载'), ('login', '登录'), ('logout', '登出'), ('other', '其他'), ) OPERATION_RESULTS = ( ('success', '成功'), ('failure', '失败'), ) # 操作者信息 - 使用TextField存储用户名或标识 operator = models.TextField( null=True, blank=True, verbose_name='操作者' ) operation_content = models.TextField(verbose_name='操作内容') operation_level = models.CharField( max_length=20, choices=OPERATION_LEVELS, verbose_name='操作级别' ) operation_result = models.CharField( max_length=10, choices=OPERATION_RESULTS, default='success', verbose_name='操作结果' ) operation_time = models.DateTimeField(default=timezone.now, verbose_name='操作时间') # 请求信息 ip_address = models.GenericIPAddressField(null=True, blank=True, verbose_name='IP地址') user_agent = models.TextField(null=True, blank=True, verbose_name='用户代理') request_method = models.CharField(max_length=10, null=True, blank=True, verbose_name='请求方法') request_path = models.CharField(max_length=500, null=True, blank=True, verbose_name='请求路径') # 业务信息 module_name = models.CharField(max_length=100, default='unknown', verbose_name='模块名称') object_id = models.CharField(max_length=100, null=True, blank=True, verbose_name='操作对象ID') class Meta: verbose_name = '操作日志' verbose_name_plural = '操作日志' ordering = ['-operation_time'] db_table = 'operation_log' indexes = [ models.Index(fields=['operation_time']), models.Index(fields=['operator', 'operation_time']), models.Index(fields=['module_name', 'operation_time']), ] def __str__(self): return f"{self.operator} - {self.operation_content} - {self.operation_time}"