Orm 如何定义flask中模型的关系

Orm 如何定义flask中模型的关系,orm,flask,models,relationship,flask-sqlalchemy,Orm,Flask,Models,Relationship,Flask Sqlalchemy,我对flask和ORM技术不熟悉,我正在做一个样本项目供我学习 在我的应用程序中,培训师可以教授一种或多种技术,因此我将我的表格定义为 培训师: 身份证 名字 电话 电子邮件 技术: 身份证 技术单位名称 断言: 身份证 培训师id 技术部 有谁能帮我把上面的表定义转换成具有适当关系的模型吗 提前感谢您想要的是多对多关系。Alchemy文档提供了一个 关于使用一个表将它们链接在一起,您的想法是正确的,但实际上并不需要其中的id列,下面是适用于您的模型的示例 technologies

我对flask和ORM技术不熟悉,我正在做一个样本项目供我学习

在我的应用程序中,培训师可以教授一种或多种技术,因此我将我的表格定义为

  • 培训师:
    • 身份证
    • 名字
    • 电话
    • 电子邮件
  • 技术:
    • 身份证
    • 技术单位名称
  • 断言:
    • 身份证
    • 培训师id
    • 技术部
  • 有谁能帮我把上面的表定义转换成具有适当关系的模型吗


    提前感谢

    您想要的是多对多关系。Alchemy文档提供了一个

    关于使用一个表将它们链接在一起,您的想法是正确的,但实际上并不需要其中的
    id
    列,下面是适用于您的模型的示例

    technologies = db.Table('technologies',
        db.Column('trainer_id', db.Integer, db.ForeignKey('trainer.id')),
        db.Column('tech_id', db.Integer, db.ForeignKey('tech.id'))
    )
    
    class Trainer(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String)
        phone = db.Column(db.String)
        email = db.Column(db.String)
        technologies = db.relationship('Tech', secondary=technologies,
            backref=db.backref('trainers', lazy='dynamic'))
    
    class Tech(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String)
    
    因此,现在您可以添加培训师和技术人员,然后根据需要分配他们:

    nano_tech = Tech(name='Nano')
    mega_tech = Tech(name='Mega')
    bob = Trainer(name='Bob', email='Whatever', technologies=[nano_tech, mega_tech])
    
    或者,您可以将现有技术添加到现有培训师中

    trainer = Trainer.query.filter_by(name='Alice').first()
    tech = Tech.query.filter_by(name='Super').first()
    trainer.technologies.append(tech)
    

    或者其中的任何组合。

    谢谢你的回答:)我需要在创建培训师记录时添加技术??你不必,我将添加一个示例如何根据技术检索培训师信息多种方法,比如说你已经有了一个技术对象
    nano=tech.query.filter_by(name='nano')。first()
    只需执行
    trainers=nano.trainers
    即可找到所有培训师。或者您可以同时进行筛选,如
    trainers=Trainer.query.filter(Trainer.technologies.any(name='Nano').all()
    或通过加入技术表
    trainers=Trainer.query.join(Trainer.technologies).filter(Tech.name='Nano').all()