【问题标题】:Join two tables and show all combinations连接两个表并显示所有组合
【发布时间】:2015-03-05 15:47:49
【问题描述】:

我有两个模型:公司和联系人。一个公司可以有多个联系人。

class Company(db.Model):
    __tablename__ = 'company'

    id = db.Column(db.Integer, primary_key=True)
    companyname = db.Column(db.String())
    contacts = db.relationship('Contact', backref='contact', lazy='dynamic')

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

    def __repr__(self):
        return '<id {}>'.format(self.id)

    def company_contacts(self):
        return Contact.query.join(id = Contact.company_id)


class Contact(db.Model):
    __tablename__ = 'contact'

    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String())
    lastname = db.Column(db.String())
    emailaddress = db.Column(db.String())
    company_id = db.Column(db.Integer, db.ForeignKey('company.id'))

    def __init__(self, firstname, lastname, emailaddress, company_id):
        self.firstname = firstname
        self.lastname = lastname
        self.emailaddress = emailaddress
        self.company_id = company_id

    def __repr__(self):
        return '<id {}>'.format(self.id)

我想在模板中显示包含公司及其联系人的列表:

Company Name
First Name Last Name

Company Name
First Name Last Name
First Name Last Name

我打算用一个 join 语句来做到这一点:

group = Company.query.join(contacts).all()

并在我的模板中有一个 for 循环通过这个进行迭代。那没有用。如何显示公司及其下的联系人?

【问题讨论】:

    标签: python flask sqlalchemy jinja2 flask-sqlalchemy


    【解决方案1】:

    您已定义公司和联系人之间的关系,因此您已经拥有按公司分组的联系人。在这种情况下,不指定lazy='dynamic' 会更有效,并且您的反向引用可能应该命名为company

    contacts = db.relationship('Contact', backref='company')
    

    您可以使用joinedload 选项进行查询,以构建一个同时获取公司及其相关联系人的查询。 (lazy='dynamic' 不能这样做。)在视图中:

    companies = Company.query.options(db.joinedload('contacts')).all()
    return render_template('companies.html', companies=companies)
    

    要显示它们,请在模板中使用嵌套的 for 循环。

    {% for company in companies %}
    <p>{{ company.companyname }}
    <ul>{% for contact in company.contacts %}
        <li>{{ contact.firstname }} {{ contact.lastname }}
    {% endfor %}</ul>
    {% endfor %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2020-09-17
      • 2017-03-31
      • 2019-03-06
      相关资源
      最近更新 更多