2012-09-26 33 views
22

Tôi cần trợ giúp tạo truy vấn SqlAlchemy.SqlAlchemy và Flask, cách truy vấn mối quan hệ nhiều-nhiều

Tôi đang thực hiện dự án Flask, nơi tôi đang sử dụng SqlAlchemy. Tôi đã tạo 3 bảng: Restaurant, Dish và restaurant_dish trong tệp models.py của tôi.

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) 

Tôi đã thêm dữ liệu vào bảng restaurant_dish và nó sẽ hoạt động chính xác. Tôi cần giúp đỡ ở đâu là hiểu được cách lấy đúng một Món ăn bằng cách sử dụng Nhà hàng. Liệu SQL sẽ là một cái gì đó như thế này:

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id 

Những gì tôi đã quản lý để có được thực hiện nhưng không làm việc:

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

Nhờ sự giúp đỡ và tôi cũng đánh giá cao sự hướng dẫn mà có thể chỉ cho tôi đi đúng hướng (tài liệu chính thức đi qua đầu của tôi).

Trả lời

43

Ngữ nghĩa của mối quan hệ không đúng. Tôi nghĩ rằng nó phải là một cái gì đó như:

class Restaurant(db.Model): 
    ... 

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

Sau đó, để lấy tất cả các món ăn trong một nhà hàng, bạn có thể làm:

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

này sẽ tạo ra một truy vấn như:

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

Cảm ơn bạn. Đó là cách chính xác để làm điều đó. :) – cancerballs

+4

Sau khi tìm kiếm giờ, 'Dish.restaurant.any' chính xác là những gì tôi đang tìm kiếm! +1 cho bạn! – Matthew

+1

câu trả lời này tốt hơn bất kỳ tài liệu nào. – user455318

Các vấn đề liên quan