flask sqlalchemy - Many To Many - filter
Verfasst: Mittwoch 26. Dezember 2018, 14:41
Guten Tag,
flask 1.0.2
sqlalchemy 1.2.13
Aufgabenstellung:
Mit einer kleinen APP möchte ich verschiedenen Flaschentypen unterschiedliche Deckelsymbole zuweisen (M2M)
Datenbankstruktur:
[Arten]-1--m-[Getraenke]-1--m-[Flaschen]-m--n-[Deckelsymbole]
Problem:
Meine Datenbankabfrage mittels .join und .filter liefert mir alle Getraenke und Flaschentypen auch wenn diese nicht das passende Deckelsymbol haben. Lediglich die Arten, die das Symbol auf den Flaschen noch nicht haben, werden herausgefiltert.
die Abfrage mit .filter(Deckelsymbole.id == 1) liefert diese Ausgabe:
-Art#1
---Getraenk#1
------Flasche#1
------Flasche#2
------Flasche#3
-----------Deckelsymbol#1
------Flasche#4
-----------Deckelsymbol#1
---Getraenk#2
------Flasche#5
------Flasche#6
gewünschte Ausgabe:
-Art#1
---Getraenk#1
------Flasche#3
-----------Deckelsymbol#1
------Flasche#4
-----------Deckelsymbol#1
Frage:
wo liegt mein Denk- bzw. Erwartungsfehler?
Vielen Dank!
models.py
flask 1.0.2
sqlalchemy 1.2.13
Aufgabenstellung:
Mit einer kleinen APP möchte ich verschiedenen Flaschentypen unterschiedliche Deckelsymbole zuweisen (M2M)
Datenbankstruktur:
[Arten]-1--m-[Getraenke]-1--m-[Flaschen]-m--n-[Deckelsymbole]
Problem:
Meine Datenbankabfrage mittels .join und .filter liefert mir alle Getraenke und Flaschentypen auch wenn diese nicht das passende Deckelsymbol haben. Lediglich die Arten, die das Symbol auf den Flaschen noch nicht haben, werden herausgefiltert.
Code: Alles auswählen
arten = Arten.query.join(Getraenke).join(Flaschen).join((Deckelsymbole, Flaschen.deckelsymbole).filter(Deckelsymbole.id == 1).all()
-Art#1
---Getraenk#1
------Flasche#1
------Flasche#2
------Flasche#3
-----------Deckelsymbol#1
------Flasche#4
-----------Deckelsymbol#1
---Getraenk#2
------Flasche#5
------Flasche#6
gewünschte Ausgabe:
-Art#1
---Getraenk#1
------Flasche#3
-----------Deckelsymbol#1
------Flasche#4
-----------Deckelsymbol#1
Frage:
wo liegt mein Denk- bzw. Erwartungsfehler?
Vielen Dank!
models.py
Code: Alles auswählen
subs_deckelsymbole_flaschen = db.Table('subs_deckelsymbole_flaschem', db.Model.metadata,
db.Column('deckelsymbol_id', db.Integer, db.ForeignKey('deckelsymbole.id')),
db.Column('flasche_id', db.Integer, db.ForeignKey('flaschen.id')))
class Deckelsymbole(db.Model):
__tablename__ = 'deckelsymbole'
id = db.Column(db.Integer, primary_key=True)
symbol = db.Column(db.String(20))
# Many To Many:
# unterschiedliche Deckelsymbole für den gleichen Flaschentyp
# unterschiedliche Falschen mit gleichem Deckelsymbol
deckelsymbole_flaschen = db.relationship('Flaschen', secondary=subs_deckelsymbole_flaschen,
backref=db.backref('deckelsymbole', lazy='dynamic'))
def __int__(self, symbol):
self.symbol = symbol
class Arten(db.Model):
__tablename__ = 'arten'
id = db.Column(db.Integer, primary_key=True)
art = db.Column(db.String(20) nullable=False, default='default_art')
# z.B alkoholfrei
getraenke = db.relationship('Getraenke', backref='art', lazy='dynamic')
def __int__(self, art):
self.art = art
class Getraenke(db.Model):
arten = db.relationship('Arten')
__tablename__ = 'getraenke'
id = db.Column(db.Integer, primary_key=True)
getraenk = db.Column(db.String(20) nullable=False, default='default_getraenk')
# z.B Sprudel
art_id = db.Column(db.Integer, db.ForeignKey('arten.id'), nullable=False)
def __int__(self, getraenk):
self.getraenk = getraenk
class Flaschen(db.Model):
getraenke = db.relationship('Getraenke')
__tablename__ = 'flaschen'
id = db.Column(db.Integer, primary_key=True)
flasche = db.Column(db.String(20) nullable=False, default='default_flasche')
# z.B Dose
getraenk_id = db.Column(db.Integer, db.ForeignKey('getraenke.id'), nullable=False)
def __int__(self, flasche, getraenk_id):
self.flasche = flasche
self.getraenk_id = getraenk_id