【问题标题】:SqlAlchemy and Flask, how to query many-to-many relationshipSqlAlchemy 和 Flask,如何查询多对多关系
【发布时间】:2012-09-17 14:07:35
【问题描述】:

我需要帮助创建 SqlAlchemy 查询。

我正在做一个使用 SqlAlchemy 的 Flask 项目。我在我的 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)

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

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id

我已经设法完成但没有工作:

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

感谢您的帮助,我也很欣赏可以为我指明正确方向的教程(官方文档超出了我的想象)。

【问题讨论】:

    标签: python sql sqlalchemy many-to-many flask


    【解决方案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
                )
        )
    

    【讨论】:

    • 搜索了几个小时后,Dish.restaurant.any 正是我想要的! +1 给你!
    • 这个答案比任何文档都好。
    • 如果我需要查询所有使用给定菜肴的餐厅怎么办?又名,反向检索。
    • 当thisrestaurant 是Restaurant 实例时,有什么办法可以Dish.restaurants.any(thisrestaurant)?我可以Dish.restaurants.any(id=thisrestaurant.id),但这听起来有点棘手
    • 是否有任何关于 'query.any' 的文档找不到...?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2011-02-18
    • 1970-01-01
    • 2019-01-18
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多