SqlAlchemy和Flask,如何查询多对多关系

can*_*lls 27 python sql many-to-many sqlalchemy flask

我需要帮助创建SqlAlchemy查询.

我正在做一个Flask项目,我正在使用SqlAlchemy.我在models.py文件中创建了3个表:Restaurant,Dish和restaurant_dish.

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)
Run Code Online (Sandbox Code Playgroud)

我已将数据添加到restaurant_dish表中,它应该正常工作.我需要帮助的地方是了解如何使用餐厅正确获取菜肴.原始SQL将是这样的:

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id
Run Code Online (Sandbox Code Playgroud)

我设法完成但没有工作:

x = Restaurant.query.filter_by(Restaurant.restaurant_dish.contains(name)).all()
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助,我也非常感谢教程可以指向正确的方向(官方文档在我的脑海中).

say*_*yap 55

这种关系的语义看起来不正确.我认为应该是这样的:

class Restaurant(db.Model):
    ...

    dishes = db.relationship('Dish', secondary=restaurant_dish,
        backref=db.backref('restaurants'))
Run Code Online (Sandbox Code Playgroud)

然后,要检索餐厅的所有菜肴,您可以:

x = Dish.query.filter(Dish.restaurants.any(name=name)).all()
Run Code Online (Sandbox Code Playgroud)

这应该生成如下查询:

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
            )
    )
Run Code Online (Sandbox Code Playgroud)

  • 搜索了几个小时后,`Dish.restaurant.any`正是我想要的!+1给你! (5认同)
  • 这个答案比任何文档都要好. (2认同)
  • 当 thisrestaurant 是 Restaurant 实例时,有没有办法做`Dish.restaurants.any(thisrestaurant)`?我可以“Dish.restaurants.any(id=thisrestaurant.id)”,但这听起来有点棘手 (2认同)