连接两个表并显示所有组合

2024-03-29 11:07:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两种模式:公司模式和联系人模式。一个公司可以有很多联系人。你知道吗

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循环来迭代这个。那没用。如何显示联系人分组在下面的公司?你知道吗


Tags: nameselfiddbstringdefcontact联系人
1条回答
网友
1楼 · 发布于 2024-03-29 11:07:24

您定义了公司和联系人之间的关系,因此您已经有按公司分组的联系人。在这种情况下,不指定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 %}

相关问题 更多 >