2012-09-26 58 views
22

我需要幫助創建SqlAlchemy查詢。SqlAlchemy和Flask,如何查詢多對多關係

我正在做一個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) 

我已將數據添加到restaurant_dish表中,並且它應該正常工作。我需要幫助的是瞭解如何正確使用餐廳的菜。原始SQL會是這樣的:

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id 

我已經成功地得到完成,但不工作:

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

感謝您的幫助,我也很欣賞教程,可以點我在正確的方向(官方文件覆蓋了我的頭)。

回答

43

關係的語義看起來不正確。我想應該是這樣的:

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 
      ) 
    ) 
+0

謝謝。這是做到這一點的正確方法。 :) – cancerballs

+4

搜索了幾個小時之後,'Dish.restaurant.any'正是我正在尋找的東西! +1給你! – Matthew

+1

這個答案比任何文檔都要好。 – user455318

相關問題