【问题标题】:SQLAlchemy one to many query outputSQLAlchemy 一对多查询输出
【发布时间】:2018-12-19 07:53:37
【问题描述】:

我需要获取planes 及其所有对应的bookings 的列表,理想情况下还有一个飞机列表,其中每架飞机都有一个预订列表作为其属性之一,因此可以轻松地对其进行 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}

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    在您的 Plane 类中添加一对多关系,如下所示。 模型.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')
    

    然后,您可以通过将飞机变量传递给您的视图来获取所有飞机预订,如下所示

    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%}
    

    在此处记录:http://techarena51.com/index.php/one-to-many-relationships-with-flask-sqlalchemy/

    我为许多 cmets 的一篇帖子写了类似的代码:https://github.com/Leo-g/flask-blog/blob/master/app/templates/single.html https://github.com/Leo-g/flask-blog/blob/master/app/models.py

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2017-04-03
      相关资源
      最近更新 更多