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				
				


