flask-sqlalchemy的模型类两个表,既有一对一又有一对多的情况时,解决方法

这种情况时,直接进行数据迁移会回报错,因为一个表需要依赖另一个表,所以可以将两个表的基本字段先迁移好,然后再新增外键字段进行迁移,就不会报错了
python 复制代码
from datetime import datetime

from api.models.base import BaseModel
from api import db
from werkzeug.security import check_password_hash, generate_password_hash
import enum



class MyEnum(enum.Enum):
    UN_ACTIVE = 0  # 没有激活
    ACTIVE = 1  # 已经激活的
    LOCKED = 2  # 被锁定


class User(BaseModel, db.Model):
    __tablename__ = 'user'
    __table_args__ = {'comment': '用户表'}
    id = db.Column(db.Integer, primary_key=True, comment='用户id')
    realname = db.Column(db.String(12), unique=True, nullable=False, comment="用户名")
    pwd = db.Column(db.String(240), nullable=False, comment="用户密码")
    email = db.Column(db.String(20), unique=True, nullable=False, comment="用户邮箱")
    telephone = db.Column(db.String(20), comment="用户电话")
    is_staff = db.Column(db.Boolean, default=True, comment="是否为员工")
    status = db.Column(db.Enum(MyEnum), default=MyEnum.UN_ACTIVE, comment="员工状态")
    date_joined = db.Column(db.DateTime, default=datetime.now, comment="入职时间")

    # 员工所属的部门(多对一)
    department_id = db.Column(db.Integer, db.ForeignKey('department.id', ondelete='CASCADE'))

    # 领导所属的部门(多对一或一对一)
    leader_id = db.Column(db.Integer, db.ForeignKey('department.id', ondelete='CASCADE'))

    # 关系:员工对应的部门
    staffs_department = db.relationship('Department', back_populates='staffs', foreign_keys=[department_id])

    # 关系:领导对应的部门
    leader_department = db.relationship('Department', back_populates='leader', foreign_keys=[leader_id])




class Department(BaseModel, db.Model):
    __tablename__ = 'department'
    __table_args__ = {'comment': '部门表'}
    id = db.Column(db.Integer, primary_key=True, comment='部门id')
    name = db.Column(db.String(20), nullable=False, unique=True, comment='部门名称')
    intro = db.Column(db.Text, comment='部门介绍')
    staff_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    # 一对多关系,表示这个部门的员工
    staffs = db.relationship('User', back_populates='staffs_department', lazy='dynamic', cascade='all, delete',
                             passive_deletes=True, foreign_keys='User.department_id')

    # 一对一关系,表示这个部门的领导
    leader = db.relationship('User', back_populates='leader_department', uselist=False, foreign_keys='User.leader_id')
相关推荐
QQ2422199793 小时前
基于python+微信小程序的家教管理系统_mh3j9
开发语言·python·微信小程序
RSTJ_16254 小时前
PYTHON+AI LLM DAY THREETY-SEVEN
开发语言·人工智能·python
郝学胜-神的一滴4 小时前
深度学习优化核心:梯度下降与网络训练全解析
数据结构·人工智能·python·深度学习·算法·机器学习
Aision_4 小时前
Agent 为什么需要 Checkpoint?
人工智能·python·gpt·langchain·prompt·aigc·agi
清水白石0084 小时前
《Python性能深潜:从对象分配开销到“小对象风暴”的破解之道(含实战与最佳实践)》
开发语言·python
Land03295 小时前
RPA工具选型技术指南:架构差异与实测数据
python·自动化·rpa
kafei_*5 小时前
VScode 添加 UV虚拟环境方法
vscode·python·uv
洛_尘6 小时前
Python 5:使用库
java·前端·python
m0_596749096 小时前
如何防止SQL拼接漏洞_使用PDO对象实现安全的SQL交互
jvm·数据库·python
AIFQuant8 小时前
2026 全球股票/外汇/贵金属行情 API 深度对比:延迟、覆盖、价格与稳定性
python·websocket·ai·金融·mcp