media.py 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from datetime import datetime
  2. from zoneinfo import ZoneInfo
  3. from app.models import db
  4. class Media(db.Model):
  5. """
  6. 媒体模型类,表示数据库中的 'media' 表。
  7. 该类存储与用户相关联的媒体的基本信息,如文件名、路径、文件类型、分辨率等。
  8. 媒体可以是图片或视频,并关联到用户。每个媒体只能属于一个用户,且可进行状态管理。
  9. Attributes:
  10. media_id (int): 媒体的唯一标识符(主键)。
  11. media_name (str): 媒体名称,必须唯一,不能为空。
  12. media_path (str): 媒体存储路径,必须唯一,不能为空。
  13. description (str): 媒体的描述信息(可选)。
  14. file_size (int): 媒体的大小(字节)。
  15. file_type (str): 媒体的类型,通常为图片或视频。
  16. resolution_width (int): 媒体的宽度(像素)。
  17. resolution_height (int): 媒体的高度(像素)。
  18. frame_count (int): 媒体的帧数(图片为 1,视频为实际帧数)。
  19. upload_at (datetime): 媒体的上传时间,默认为当前时间。
  20. updated_at (datetime): 媒体的最后更新时间,默认为当前时间,并在更新时自动更新。
  21. owner_id (int): 所属用户的唯一标识符(外键)。
  22. Relationships:
  23. owner (User): 一个媒体只属于一个用户,表示该媒体的所有者。
  24. detections (Detection): 一个媒体可以有多个检测分割记录(反向关系,表示该媒体参与的所有检测任务)。
  25. """
  26. __tablename__ = 'media'
  27. media_id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 媒体 ID
  28. media_name = db.Column(db.String(255), unique=True, nullable=False) # 媒体名称
  29. media_path = db.Column(db.String(255), unique=True, nullable=False) # 媒体存储路径
  30. description = db.Column(db.Text, default='暂无描述') # 媒体描述
  31. file_size = db.Column(db.Float, default=0.0) # 文件大小(KB)
  32. file_type = db.Column(db.String(50), nullable=False) # 文件类型(图片或视频)
  33. resolution_width = db.Column(db.Integer, default=0) # 分辨率宽度
  34. resolution_height = db.Column(db.Integer, default=0) # 分辨率高度
  35. frame_count = db.Column(db.Integer, default=1, nullable=False) # 帧数(图片为 1,视频为实际帧数)
  36. upload_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 上传时间
  37. updated_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai")),
  38. onupdate=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 最后更新时间
  39. owner_id = db.Column(db.Integer, db.ForeignKey('user.user_id'), nullable=False) # 所属用户 ID(外键)
  40. # 设置与 User 表的关系:一份媒体文件只属于一个用户
  41. owner = db.relationship('User', backref=db.backref('medias', lazy=True))
  42. def __repr__(self):
  43. return (f"Media(media_id={self.media_id}, "
  44. f"media_name={self.media_name}, "
  45. f"media_path={self.media_path}, "
  46. f"description={self.description}, "
  47. f"file_size={self.file_size}, "
  48. f"file_type={self.file_type}, "
  49. f"resolution_width={self.resolution_width}, "
  50. f"resolution_height={self.resolution_height}, "
  51. f"frame_count={self.frame_count}, "
  52. f"upload_at={self.upload_at}, "
  53. f"updated_at={self.updated_at}, "
  54. f"owner_id={self.owner_id})")
  55. def to_dict(self):
  56. """
  57. 将 Media 实例转化为字典。
  58. """
  59. return {
  60. 'media_id': self.media_id,
  61. 'media_name': self.media_name,
  62. 'media_path': self.media_path,
  63. 'description': self.description,
  64. 'file_size': self.file_size,
  65. 'file_type': self.file_type,
  66. 'resolution_width': self.resolution_width,
  67. 'resolution_height': self.resolution_height,
  68. 'frame_count': self.frame_count,
  69. 'upload_at': self.upload_at,
  70. 'updated_at': self.updated_at,
  71. 'owner_id': self.owner_id
  72. }