2012-09-26 30 views
22

SqlAlchemyクエリを作成する際に助けが必要です。SqlAlchemyとFlask、多対多の関係を照会する方法

私はSqlAlchemyを使用しているFlaskプロジェクトを行っています。私は3つのテーブルを作成しました:レストラン、料理、レストラン_食事は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テーブルにデータを追加して、それが正しく動作する必要があります。私が助けが必要なところは、レストランを使って正しく食べる方法を理解することです。私を成し遂げるために管理が、働いていない何

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id 

:ヘルプと私のための

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

おかげでも(正しい方向に私を指すことができるチュートリアルを感謝生SQLはこのようなものになるだろう公式の文書は私の頭の上に行く)。

答えて

43

関係の意味が正しく見えません。私はそれのようなものであるべきだと思う。そして、

class Restaurant(db.Model): 
    ... 

    dishes = db.relationship('Dish', secondary=restaurant_dish, 
     backref=db.backref('restaurants')) 

を、レストランのすべての料理を取得するには、あなたが行うことができます:

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

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

これは、のようなクエリを生成する必要がありますありがとうございました。それが正しい方法でした。 :) – cancerballs

+4

時間を検索した後、 'Dish.restaurant.any'はまさに私が探していたものでした!あなたに+1! – Matthew

+1

この回答はどの文書よりも優れています。 – user455318

関連する問題