SQLAlchemy y Matraz, cómo consultar la relación de muchos a muchos


Necesito ayuda para crear la consulta SQLAlchemy.

Estoy haciendo un proyecto Flask donde estoy usando SQLAlchemy. He creado 3 mesas: Restaurante, Plato y restaurant_dish en mi models.py archivo.

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)

He añadido datos a la tabla restaurant_dish y debería estar funcionando correctamente. Donde necesito ayuda es entender cómo conseguir correctamente un Plato usando el Restaurante. Raw SQL sería algo como esto:

SELECT dish_id FROM restaurant_dish WHERE restaurant_id == id

Lo que he logrado hacer pero no trabajo:

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

Gracias por la ayuda y también aprecio los tutoriales que me pueden apuntar en la dirección correcta(la documentación oficial pasa por encima de mi cabeza).

Author: cancerballs, 2012-09-26

1 answers

La semántica de la relación no se ve bien. Creo que debería ser algo como:

class Restaurant(db.Model):
    ...

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

Entonces, para recuperar todos los platos para un restaurante, puede hacer:

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

Esto debería generar una consulta como:

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
Author: sayap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-26 03:37:48