SqlAlchemy и Flask, как запросить отношения "многие ко многим"
Мне нужна помощь в создании запроса SqlAlchemy.
Я делаю проект Flask, где я использую SqlAlchemy. Я создал 3 таблицы: Restaurant, Dish и restaurant_dish в файле 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)
Я добавил данные в таблицу restaurant_dish и должен работать правильно. Где мне нужна помощь - это понимание того, как правильно получить блюдо с помощью ресторана. Необработанный SQL будет примерно таким:
SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id
Что мне удалось сделать, но не работать:
x = Restaurant.query.filter_by(Restaurant.restaurant_dish.contains(name)).all()
Спасибо за помощь, и я также ценю учебные пособия, которые могут указывать мне в правильном направлении (официальная документация проходит над моей головой).
Ответы
Ответ 1
Семантика отношений выглядит не так. Я думаю, что это должно быть что-то вроде:
class Restaurant(db.Model):
...
dishes = db.relationship('Dish', secondary=restaurant_dish,
backref=db.backref('restaurants'))
Затем, чтобы получить все блюда для ресторана, вы можете сделать:
x = Dish.query.filter(Dish.restaurants.any(name=name)).all()
Это должно сгенерировать запрос типа:
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
)
)