Flask SQLAlchemy一对多查询输出

Flask SQLAlchemy一对多查询输出,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,我需要得到一个平面的列表和所有相应的预订,理想情况下是一个平面列表,其中每个平面都有一个预订列表作为其属性之一,因此可以轻松地进行json编码。我怎样才能用SQLAlchemy做到这一点?我怀疑SQLAlchemy有一些强大的功能使这变得容易,我不想做2次查询并处理结果 实验结果: Plane - id: -- 1 - name: -- Eagle Bravo - bookings: -- Booking1, Booking2, Booking3 Plane - id:

我需要得到一个
平面的列表
和所有相应的
预订
,理想情况下是一个平面列表,其中每个平面都有一个预订列表作为其属性之一,因此可以轻松地进行json编码。我怎样才能用SQLAlchemy做到这一点?我怀疑SQLAlchemy有一些强大的功能使这变得容易,我不想做2次查询并处理结果

实验结果:

Plane
- id:       -- 1
- name:     -- Eagle Bravo
- bookings: -- Booking1, Booking2, Booking3

Plane
- id:       -- 2
- name:     -- Charlie Bravo
- bookings: -- Booking4, Booking5, Booking6

Plane
- id:       -- 3
- name:     -- Alpha Bravo
- bookings: -- Booking7, Booking8, Booking9
飞机和预订模型:

class Booking(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    start_date = db.Column(db.DateTime)
    end_date = db.Column(db.DateTime)
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
    person = db.relationship('Person', backref=db.backref('Bookings', lazy='dynamic'))
    plane_id = db.Column(db.Integer, db.ForeignKey('plane.id'))

    def __init__(self, start_date, end_date, person_id):
        self.start_date = start_date
        self.end_date = end_date
        self.person_id = person_id

    def __repr__(self):
        return '<Booking... %r>'

    def as_dict(self):
       return {c.name: getattr(self, c.name) for c in self.__table__.columns}


class Plane(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Plane... %r>'

    def as_dict(self):
       return {c.name: getattr(self, c.name) for c in self.__table__.columns}
班级预订(db.Model):
id=db.Column(db.Integer,主键=True)
开始日期=db.Column(db.DateTime)
end_date=db.Column(db.DateTime)
person\u id=db.Column(db.Integer,db.ForeignKey('person.id'))
person=db.relationship('person',backref=db.backref('Bookings',lazy='dynamic'))
平面id=db.Column(db.Integer,db.ForeignKey('plane.id'))
定义初始日期(自我、开始日期、结束日期、个人id):
self.start\u date=开始日期
self.end\u日期=end\u日期
self.person\u id=person\u id
定义报告(自我):
返回“”
定义为(自身):
返回{c.name:getattr(self,c.name),用于self中的c。_table__.columns}
类平面(数据库模型):
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(80))
定义初始化(self,name):
self.name=名称
定义报告(自我):
返回“”
定义为(自身):
返回{c.name:getattr(self,c.name),用于self中的c。_table__.columns}

在Plane类中添加一对多关系,如下所示。 models.py

class Plane(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    bookings=db.relationship('Bookings', backref='plane', lazy='dynamic')
然后,通过将一个planes变量传递给视图,可以获得所有的飞机预订,如下所示

controller.py

@app.route('/list')
def plane_list():
    planes=Plane.query.all()
    return render_template('index.html', planes=planes)
Views.py

{% for plane in planes %}
  {{plane.id}]
  {{plane.name}}
  {%for booking in plane.bookings.all()%}
       {{booking.id}},       

   {%endfor%}
{%endfor%}
此处记录:

我为一篇文章和许多评论编写了类似的代码: