2017-11-18 2 views
0

mein Filter auf Kinder funktioniert nicht. Ich bin mir nicht sicher, was es falsch gemacht wird.Flask sqlalchemy - viele zu viele Beziehung - Filtern nach Kinderlevel

country.py

product_country = Table('product_country', Base.metadata, 
    Column('product_id', Integer, ForeignKey('product.id'), primary_key=True), 
    Column('country_id', Integer, ForeignKey('country.id'), primary_key=True) 
) 

class Country(Base): 
    __tablename__="country" 
    id = Column(Integer, primary_key=True) 
    name = Column(String(200)) 
    products = relationship(Product, secondary=product_country, backref='countries') 

product.py

class Product(Base): 
    __tablename__="product" 
    id = Column(Integer, primary_key=True) 
    color = Column(Integer) 
    .... 

dann sqlalchemy Suche:

country = s.query(Country).join(Country.products).filter(Country.id==1).filter(Product.color==1).first() 

Nun, ich Land mit id = 1, was ist, was ich will , aber in der Liste country.products würde ich nur Produkte mit Farbe = 1 erwarten, aber es sind alle Produkte dem Land zugeordnet. Bitte könnten Sie mir helfen. Danke

+0

Können Sie ein vollständigeres Snippet von 'Product' posten, da wir nicht sehen können, wie' Product.color' definiert ist. – bgse

+0

@bgse - Ich habe die Produktklasse aktualisiert, in der die Farbe jetzt definiert ist. Aber es geht nicht um die Definition von Farbe. Sie können Farbe durch ID in sqlalchemy Abfrage ersetzen und es gibt das gleiche Problem – user4206969

Antwort

0

Das ist ein Missverständnis. Das Laden der Beziehung ist aus guten Gründen getrennt von Ihrer Abfrage. Mit anderen Worten, der von Ihnen verwendete Join wird nicht verwendet, um die Beziehung zu laden. Sie könnten die Abfrage anweisen, dass sie einen eifrigen Ladejoin mit contains_eager() enthält, und lesen Sie "the zen of joined eager loading", um zu verstehen, und "Using contains_eager() to load a custom-filtered collection result" für ein Beispiel, wie Sie das tun, was Sie versuchen. In Ihrem Fall fügen Sie einfach

options(contains_eager(Country.products)) 

zu Ihrer Abfrage hinzu.

+0

danke für die Erklärung. – user4206969

Verwandte Themen