代码之家  ›  专栏  ›  技术社区  ›  jul

如何在sqlalchemy的插入事件之前添加模型的关系实例?

  •  0
  • jul  · 技术社区  · 7 年前

    我想在创建此模型的实例时添加模型关系的实例。

    插入前 sqlalchemy事件允许设置简单的属性,它似乎无法处理关系。

    这次活动能做到这一点吗?实现这一目标的标准方法是什么?

    audio_project_rel = db.Table(
        'audio_project_rel',
        db.Column('project_id', db.Integer, db.ForeignKey('project.id'), primary_key=True),
        db.Column('audio_id', db.Integer, db.ForeignKey('audio.id'), primary_key=True)
    )
    
    class Audio(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        path = db.Column(db.String, unique=True, nullable=False)
    
    class Project(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String, unique=True, nullable=False)
        audiolist_filename = db.Column(db.String, nullable=False)
        audios = db.relationship('Audio',
                secondary=audio_project_rel,
                lazy=True,
                backref=db.backref('projects', lazy=True))
    
    @event.listens_for(Project, 'before_insert')
    def get_audiolist_from_file(mapper, connection, project):    
        with open(project.audiolist_filename, 'r') as audiolist_file:
            for line in audiolist_file:
                _path = line.strip()
                audio = Audio.query.filter(Audio.path==_path).first()
                if not audio:
                    audio = Audio()
                    audio.path = _path 
                project.audios.append(audio) # not added
            project.name = 'somename' # added
    
    0 回复  |  直到 7 年前
    推荐文章