Lets einige Aliase definieren, um Ausführlichkeit zu reduzieren, bevor bei möglichen Lösungen suchen:
P, U = Product, UnallowedProduct
Version-1: OUTER JOIN + WHERE IS NULL
Das ist ganz universelle Lösung und sollte mit allen arbeiten Backends (RDBMS)
q = (
session.query(P)
.outerjoin(U, and_(P.barcode == U.barcode, P.partner == U.partner))
.filter(U.id == None)
)
Version-2: Tupel Vergleich
Dies gilt nicht für alle Backends arbeiten, sollte aber für mySQL arbeiten, postgresql Siehe tuple_
documentation
q = (
session.query(P)
.filter(~tuple_(P.barcode, P.partner).in_(
select([U.barcode, U.partner])
))
)
Version-3: Verwenden Sie mehrere OR-Anweisungen
this answer See. Es gibt keinen Grund, es zu verwenden, da Version-1 und Version-2 sauberer sind.
Version-4: Verkettung von Barcode und Partner in einer Spalte
this question See. Dies ist im Grunde Ihre eigene Lösung. Auch hier gibt es keinen Grund, es zu verwenden, da andere Versionen viel sauberer sind und keine Konvertierungen zu Strings usw. erfordern.