python - tutorial - sqlalchemy documentation
Flask-SQLAlchemy: múltiples filtros a través de una relación (1)
Tengo dos modelos, Etiquetas y Fotos, que tienen una relación de muchos a muchos, así:
tag_identifier = db.Table(''tag_identifier'',
db.Column(''photo_id'', db.Integer, db.ForeignKey(''photo.id'')),
db.Column(''tag_id'', db.Integer, db.ForeignKey(''tag.id''))
)
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
class Photo(db.Model):
id = db.Column(db.Integer, primary_key=True)
tags = db.relationship(''Tag'', secondary=tag_identifier,
backref=db.backref(''photos'', lazy=''dynamic''), lazy=''dynamic'')
Estoy intentando consultar todas las fotos que tienen varias etiquetas específicas. Por ejemplo, si tuviera que consultar todas las fotos con <Tag 1>
y <Tag 2>
:
Photo.query.join(Photo.tags).filter(Tag.id==1).all()
devolverá
[<Photo 1>, <Photo 2>, <Photo 3>, <Photo 4>]
, y
Photo.query.join(Photo.tags).filter(Tag.id==2).all()
devolverá
[<Photo 1>, <Photo 2>, <Photo 5>, <Photo 6>]
.
En este ejemplo, qué operación necesitaría hacer para obtener el siguiente resultado: [<Photo 1>, <Photo 2>]
q = (Photo.query
.filter(Photo.tags.any(Tag.id == 1))
.filter(Photo.tags.any(Tag.id == 2))
)
Tenga en cuenta que también puede verificar los nombres:
tag1, tag2 = ''tag1'', ''tag2''
q = (Photo.query
.filter(Photo.tags.any(Tag.name == tag1))
.filter(Photo.tags.any(Tag.name == tag2))
)