У меня есть три модели (обратите внимание, что это делается в Flask-SQLAlchemy, но если вы можете написать ответ только для ванильной SQLAlchemy, то это нормально для меня.) Для наглядности несущественные поля удалены.
class KPI(db.Model):
__tablename__ = 'kpis'
id = db.Column(db.Integer, primary_key=True)
identifier = db.Column(db.String(length=50))
class Report(db.Model):
__tablename__ = 'reports'
id = db.Column(db.Integer, primary_key=True)
class ReportKPI(db.Model):
report_id = db.Column(db.Integer, db.ForeignKey('reports.id'), primary_key=True)
kpi_id = db.Column(db.Integer, db.ForeignKey('kpis.id'), primary_key=True)
report = db.relationship('Report', backref=db.backref('values'))
kpi = db.relationship('KPI')
Моя цель - найти все Report
объекты, которые не измеряют определенный KPI
(т. Е. Не существует ReportKPI
объекта, для отношения KPI
которого identifier
установлено определенное значение).
Одна из моих попыток выглядит как
Report.query \
.join(ReportKPI) \
.join(KPI) \
.filter(KPI.identifier != 'reflection')
, но это возвращает больше Report
объектов, которые действительно существуют (я думаю, что я получаю один для каждого ReportKPI
, у которого есть KPI
с чем угодно, кроме «отражения».)
Реально ли то, чего я хочу достичь с помощью SQLAlchemy? Если да, то какое волшебное слово (мольбы, похоже, не работают ...)