remove query many delete binds python sql sqlalchemy many-to-many flask

python - query - SqlAlchemy y Flask, cómo consultar la relación de muchos a muchos



sqlalchemy query (1)

La semántica de la relación no se ve bien. Creo que debería ser algo así como:

class Restaurant(db.Model): ... dishes = db.relationship(''Dish'', secondary=restaurant_dish, backref=db.backref(''restaurants''))

Luego, para recuperar todos los platos de un restaurante, puede hacer:

x = Dish.query.filter(Dish.restaurants.any(name=name)).all()

Esto debería generar una consulta como:

SELECT dish.* FROM dish WHERE EXISTS ( SELECT 1 FROM restaurant_dish WHERE dish.id = restaurant_dish.dish_id AND EXISTS ( SELECT 1 FROM restaurant WHERE restaurant_dish.restaurant_id = restaurant.id AND restaurant.name = :name ) )

Necesito ayuda para crear la consulta SqlAlchemy.

Estoy haciendo un proyecto Flask donde estoy usando SqlAlchemy. Creé 3 tablas: Restaurant, Dish y restaurant_dish en mi archivo models.py.

restaurant_dish = db.Table(''restaurant_dish'', db.Column(''dish_id'', db.Integer, db.ForeignKey(''dish.id'')), db.Column(''restaurant_id'', db.Integer, db.ForeignKey(''restaurant.id'')) ) class Restaurant(db.Model): id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(64), index = True) restaurant_dish = db.relationship(''Dish'', secondary=restaurant_dish, backref=db.backref(''dishes'', lazy=''dynamic'')) class Dish(db.Model): id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(64), index = True) info = db.Column(db.String(256), index = True)

He agregado datos a la tabla restaurant_dish y debería estar funcionando correctamente. Donde necesito ayuda es entender cómo obtener un plato usando el restaurante correctamente. Raw SQL sería algo como esto:

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id

Lo que he logrado hacer pero no funciona:

x = Restaurant.query.filter_by(Restaurant.restaurant_dish.contains(name)).all()

Gracias por su ayuda y también aprecio los tutoriales que pueden orientarme en la dirección correcta (la documentación oficial pasa por alto).