连接两个表并显示所有组合
Join two tables and show all combinations
我有两个模型:公司和联系人。一个公司可以有多个联系人。
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
我打算用一个连接语句来做到这一点:
group = Company.query.join(contacts).all()
并且在我的模板中有一个 for 循环迭代这个。那没有用。如何显示公司及其下分组的联系人?
您定义了公司和联系人之间的关系,因此您已经拥有按公司分组的联系人。在这种情况下,不指定 lazy='dynamic'
会更有效,您的 backref 可能应该命名为 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 %}
我有两个模型:公司和联系人。一个公司可以有多个联系人。
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
我打算用一个连接语句来做到这一点:
group = Company.query.join(contacts).all()
并且在我的模板中有一个 for 循环迭代这个。那没有用。如何显示公司及其下分组的联系人?
您定义了公司和联系人之间的关系,因此您已经拥有按公司分组的联系人。在这种情况下,不指定 lazy='dynamic'
会更有效,您的 backref 可能应该命名为 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 %}