2012-09-26 15 views
22

मुझे एसक्लएल्किमी क्वेरी बनाने में मदद की ज़रूरत है।एसक्लएल्चेमी और फ्लास्क, कई से कई रिश्ते कैसे पूछें

मैं एक फ्लास्क प्रोजेक्ट कर रहा हूं जहां मैं स्क्लक्लेमी का उपयोग कर रहा हूं। मैंने 3 टेबल बनाए हैं: रेस्तरां, डिश और restaurant_dish मेरे 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) 

मैंने रेस्तरां_डिश तालिका में डेटा जोड़ा है और इसे सही तरीके से काम करना चाहिए। जहां मुझे सहायता चाहिए, यह समझना है कि रेस्तरां का उपयोग करके डिश को सही तरीके से कैसे प्राप्त किया जाए। कच्चे एसक्यूएल कुछ इस तरह होगा:

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')) 

फिर, एक रेस्तरां के लिए सभी व्यंजनों को पुनः प्राप्त करने के लिए, आप कर सकते हैं:

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

घंटों के लिए खोज करने के बाद, 'डिश। रेस्टॉरेंट.न्या' वही था जो मैं ढूंढ रहा था! आपको +1 – Matthew

+1

यह उत्तर किसी भी दस्तावेज़ीकरण से बेहतर है। – user455318

संबंधित मुद्दे