SqlAlchemy et Flask, comment interroger la relation de plusieurs à plusieurs

j'ai besoin d'aide pour créer la requête SqlAlchemy.

je fais un projet de flasque où J'utilise SqlAlchemy. J'ai créé 3 tables: Restaurant, plat et restaurant_dish dans mon models.py file.

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)

j'ai ajouté des données à la table restaurant_dish et cela devrait fonctionner correctement. Là où j'ai besoin d'aide est de comprendre comment obtenir correctement un plat en utilisant le Restaurant. Raw SQL serait quelque chose comme ceci:

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id

Ce que j'ai réussi à faire, mais ne fonctionne pas:

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

Merci pour votre aide et j'apprécie aussi les tutoriels qui peuvent me guider dans la bonne direction(la documentation officielle passe au-dessus de ma tête).

26
demandé sur cancerballs 2012-09-26 05:41:00

1 réponses

la sémantique de la relation ne semble pas juste. Je pense qu'il devrait être quelque chose comme:

class Restaurant(db.Model):
    ...

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

Ensuite, pour récupérer tous les plats d'un restaurant, vous pouvez faire:

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

ceci devrait générer une requête comme:

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
            )
    )
47
répondu sayap 2012-09-26 03:37:48