Files
012-kaopeilian/backend/app/models/position.py
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

55 lines
2.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
岗位Position数据模型
"""
from typing import Optional
from sqlalchemy import String, Integer, Text, ForeignKey, Boolean, JSON
from sqlalchemy.orm import Mapped, mapped_column, relationship
from typing import Optional, List
from .base import BaseModel, SoftDeleteMixin, AuditMixin
class Position(BaseModel, SoftDeleteMixin, AuditMixin):
"""
岗位表
字段说明:
- name: 岗位名称
- code: 岗位编码(唯一),用于稳定引用
- description: 岗位描述
- parent_id: 上级岗位ID支持树形结构
- status: 状态active/inactive
"""
__tablename__ = "positions"
__allow_unmapped__ = True
name: Mapped[str] = mapped_column(String(100), nullable=False, index=True)
code: Mapped[str] = mapped_column(String(100), nullable=False, unique=True, index=True)
description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
parent_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("positions.id", ondelete="SET NULL"))
status: Mapped[str] = mapped_column(String(20), default="active", nullable=False)
# 新增字段
skills: Mapped[Optional[List]] = mapped_column(JSON, nullable=True, comment="核心技能")
level: Mapped[Optional[str]] = mapped_column(String(20), nullable=True, comment="岗位等级")
sort_order: Mapped[Optional[int]] = mapped_column(Integer, default=0, nullable=True, comment="排序")
# 关系
parent: Mapped[Optional["Position"]] = relationship(
"Position", remote_side="Position.id", backref="children", lazy="selectin"
)
# 成员关系(通过关联表)
members = relationship("PositionMember", back_populates="position", cascade="all, delete-orphan")
# 课程关系(通过关联表)
courses = relationship("PositionCourse", back_populates="position", cascade="all, delete-orphan")
def __repr__(self) -> str:
return f"<Position(id={self.id}, name={self.name}, code={self.code}, status={self.status})>"