首页 > 解决方案 > 反向迭代 Flask Sqlalchemy

问题描述

这是我的模型

一个作业最多可以有 2 个面(正面或背面)或只有正面

每面有多个碎片

class Job(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    sides = db.relationship('Side', backref=db.backref('job', lazy=True))

class Side(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    job_id = db.Column(db.Integer, db.ForeignKey('job.id'))
    pieces = db.relationship('Piece', backref='side', lazy='select')

class Piece(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True, nullable=False)
    filename_img = db.Column(db.String(50), unique=True, nullable=True)
    side_id = db.Column(db.Integer, db.ForeignKey('side.id'))

通常我通过以下方式实现这些部分:Get Job Id -> Side -> Pieces

填充数据库的示例

Job 1
  Front
    Piece 1
    Piece 2
  Back
    Piece 1

Job 2
  Front
    Piece 3
    Piece 4
  Back
    Piece 3
    Piece 4

上面的示例显示,Piece 1 有正面和背面,Piece 2 只有 1 Side,即 Job 1 的 Front。在这种情况下,我想按 Pieces 而不是 Sides 进行迭代。那可能吗?

我想要的结果是:

Job 1
  Piece 1
    Front
    Back
  Piece 2
    Front
Job 2
  Piece 3
    Front
    Back
  Piece 4
    Front
    Back

标签: flasksqlalchemyflask-sqlalchemy

解决方案


我认为您需要一个用于 Side 和 Piece 之间的多对多关联表,然后将片段添加为 Job 的关系。这可能有效:

sides_pieces = db.Table(
    'sides_pieces',
    db.Column('side_id', db.Integer, db.ForeignKey('sides.id'), nullable=False),
    db.Column('piece_id', db.Integer, db.ForeignKey('pieces.id'), nullable=False)
)

class Job(db.Model):
    __tablename__ = 'jobs'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), nullable=False)
    sides = db.relationship('Side', backref=db.backref('job', lazy=True))
    pieces = db.relationship('Piece', backref=db.backref('job', lazy=True))

class Side(db.Model):
    __tablename__ = 'sides'
    id = db.Column(db.Integer, primary_key=True)
    job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'))
    pieces = db.relationship('Piece', secondary=sides_pieces, back_populates="sides")

class Piece(db.Model):
    __tablename__ = 'pieces'
    id = db.Column(db.Integer, primary_key=True)
    job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'))
    name = db.Column(db.String(50), unique=True, nullable=False)
    filename_img = db.Column(db.String(50), unique=True, nullable=True)
    sides = db.relationship('Side', secondary=sides_pieces, back_populates="pieces")

推荐阅读