SQLAlchemy查询父级以查找所有子级

时间:2020-07-17 19:53:52

标签: python-3.x flask flask-sqlalchemy

我有一个数据库,在该数据库中,我的父母(公司)与孩子(买方)之间存在一对多的关系。我想遍历每家公司以列出该公司中的所有买家,并在我的html页面中列出他们。

我最初的尝试是尝试companies = Company.query.all(),然后使用诸如`companies.buyer.firstname之类的东西来访问它,但这会出错

“列表”对象没有属性“买方”

任何帮助将不胜感激。谢谢!

view.py

class ListCompanies(MethodView):
    decorators = [login_required]
    template_file = 'dashboard.html'

    def get(self):
        companies = Company.query.all()
        print(f'buyer is {companies.buyer.firstname}')
        return render_template(self.template_file, companies=companies)

Models.py

class Company(db.Model, UserMixin):

    __tablename__ = 'company'

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True, nullable=False)
    company = db.Column(db.String(64), index=True, nullable=False)
    company_url = db.Column(db.String(64), index=True, nullable=False)
    # Child relationship to the Event
    event_id = db.Column(db.Integer, db.ForeignKey('events.id'))
    password_hash = db.Column(db.String(128))
    # Company is parent to the buyer
    buyer = db.relationship('Buyers', backref='buyer', lazy='dynamic')

    def __init__(
        self, email, company, company_url, event_id, password
    ):
        self.email = email
        self.company = company
        self.company_url = company_url
        self.event_id = event_id

        self.password_hash = generate_password_hash(password)
        # self.user_type = user_type

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return f"{self.company}"


class Buyers(db.Model, UserMixin):
    __tablename__ = 'buyers'

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True, nullable=False)
    firstname = db.Column(db.String(64), index=True, nullable=False)
    lastname = db.Column(db.String(64), index=True, nullable=False)
    # The buyer is the child to the company
    company = db.Column(db.Integer, db.ForeignKey('company.id'))
    # The buyer is the parent to the eventdetails
    details = db.relationship('Eventdetails', backref='buyer', lazy='dynamic')

    def __init__(
        self, email, firstname, lastname, company
    ):
        self.email = email
        self.firstname = firstname
        self.lastname = lastname
        self.company = company

    def __repr__(self):
        return f"Welcome, {self.firstname} {self.lastname}"

1 个答案:

答案 0 :(得分:1)

Company.query.all()返回公司列表。如您所说,您必须遍历这些。如果您想获得名字,同样适用于买家。

为了使您的示例更加容易理解,我将您的示例简化为最低限度。

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

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), index=True, nullable=False)

    buyers = db.relationship('Buyer', backref='company', lazy='dynamic')

class Buyer(db.Model):
    __tablename__ = 'buyers'

    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(64), index=True, nullable=False)
    lastname = db.Column(db.String(64), index=True, nullable=False)

    company_id = db.Column(db.Integer, db.ForeignKey('companies.id'))
class ListCompanies(MethodView):
    template_file = 'dashboard.html'
    def get(self):
        companies = Company.query.all()
        return render_template(self.template_file, companies=companies)
<ul>
{% for company in companies %}
    <li>
      <span>{{ company.name }}</span>
      <ul>
      {% for buyer in company.buyers %}
        <li>{{ buyer.lastname }}, {{ buyer.firstname }}</li>
      {% endfor %}
      </ul>
    </li>
{% endfor %}
</ul>
相关问题