models.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.db import models
  2. from django.utils import timezone
  3. class OperationLog(models.Model):
  4. OPERATION_LEVELS = (
  5. ('view', '查看'),
  6. ('update', '更新'),
  7. ('new', '新增'),
  8. ('delete', '删除'),
  9. ('download', '下载'),
  10. ('login', '登录'),
  11. ('logout', '登出'),
  12. ('other', '其他'),
  13. )
  14. OPERATION_RESULTS = (
  15. ('success', '成功'),
  16. ('failure', '失败'),
  17. )
  18. # 操作者信息 - 使用TextField存储用户名或标识
  19. operator = models.TextField(
  20. null=True,
  21. blank=True,
  22. verbose_name='操作者'
  23. )
  24. operation_content = models.TextField(verbose_name='操作内容')
  25. operation_level = models.CharField(
  26. max_length=20,
  27. choices=OPERATION_LEVELS,
  28. verbose_name='操作级别'
  29. )
  30. operation_result = models.CharField(
  31. max_length=10,
  32. choices=OPERATION_RESULTS,
  33. default='success',
  34. verbose_name='操作结果'
  35. )
  36. operation_time = models.DateTimeField(default=timezone.now, verbose_name='操作时间')
  37. # 请求信息
  38. ip_address = models.GenericIPAddressField(null=True, blank=True, verbose_name='IP地址')
  39. user_agent = models.TextField(null=True, blank=True, verbose_name='用户代理')
  40. request_method = models.CharField(max_length=10, null=True, blank=True, verbose_name='请求方法')
  41. request_path = models.CharField(max_length=500, null=True, blank=True, verbose_name='请求路径')
  42. # 业务信息
  43. module_name = models.CharField(max_length=100, default='unknown', verbose_name='模块名称')
  44. object_id = models.CharField(max_length=100, null=True, blank=True, verbose_name='操作对象ID')
  45. class Meta:
  46. verbose_name = '操作日志'
  47. verbose_name_plural = '操作日志'
  48. ordering = ['-operation_time']
  49. db_table = 'operation_log'
  50. indexes = [
  51. models.Index(fields=['operation_time']),
  52. models.Index(fields=['operator', 'operation_time']),
  53. models.Index(fields=['module_name', 'operation_time']),
  54. ]
  55. def __str__(self):
  56. return f"{self.operator} - {self.operation_content} - {self.operation_time}"