简体   繁体   中英

SQLAlchemy - Query parent by its children's name found in a list

I have 2 classes that are my child and parent class: This is my parent

class History(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    imagePath = db.Column(db.Text, nullable=False)
    scanDate = db.Column(db.Date, nullable=False)
    isLastScan = db.Column(db.Boolean, nullable=False)

    historyClasses = db.relationship('HistoryClasses', backref='history')

And this is the children:

class Classes(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)

    historyClasses = db.relationship('HistoryClasses', backref='class')

My associasion class is this:

class HistoryClasses(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    historyId = db.Column(db.Integer, db.ForeignKey("history.id"), nullable=False)
    classId = db.Column(db.Integer, db.ForeignKey("classes.id"), nullable=False)
    numberOfClasses = db.Column(db.Integer, nullable=False)

I am trying to query for every Parent that have Chilren with names found in a list. Eg for this: ('person', 'apple') I need an output like this one but the third row only contains 'person' class. https://ibb.co/zrknbLP

I solved this issue using this:

        if classFilterList:
        filterList.append(Classes.name.in_(classFilterList))
        imagePaths = db.session.query(History.imagePath) \
            .outerjoin(Classifiers, Classifiers.id == History.classifierId) \
            .outerjoin(HistoryClasses, HistoryClasses.historyId == History.id) \
            .outerjoin(Classes, Classes.id == HistoryClasses.classId) \
            .filter(*filterList) \
            .group_by(History.id) \
            .having(db.func.count(HistoryClasses.classId.distinct()) == len(set(classFilterList))) \
            .all()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM