【问题标题】:Selecting Rows based on multiple related tables基于多个相关表选择行
【发布时间】:2014-10-21 00:18:23
【问题描述】:

我有以下型号:

modifiers = db.Table('modifiers',
    db.Column('modifier', db.Integer, db.ForeignKey('modifier.id')),
    db.Column('modified_ingredient', db.Integer, db.ForeignKey('modified_ingredient.id')),
    )

modified_ingredients = db.Table('modified_ingredients',
    db.Column('recipe', db.Integer, db.ForeignKey('recipe.id')),
    db.Column('modified_ingredient', db.Integer, db.ForeignKey('modified_ingredient.id'))
    )

class Recipe(db.Model):
    __tablename__ = 'recipe'

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(256))
    description = db.Column(db.Text)
    directions = db.Column(db.Text)
    prep_time = db.Column(db.Integer)
    cook_time = db.Column(db.Integer)
    image = db.Column(db.LargeBinary())
    ingredients = db.relationship('ModifiedIngredient', secondary=modified_ingredients)

class Ingredient(db.Model):
    __tablename__ = 'ingredient'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), index=True, unique=True)
    mod_ing = db.relationship("ModifiedIngredient")

class Modifier(db.Model):
    __tablename__ = 'modifier'

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(30), index=True, unique=True)

class ModifiedIngredient(db.Model):
    __tablename__ = 'modified_ingredient'

    id = db.Column(db.Integer, primary_key=True)

    amount = db.Column(db.Integer)
    unit = db.Column(db.String(20))
    ingredient = db.Column(db.Integer, db.ForeignKey('ingredient.id'))
    modifiers = db.relationship('Modifier', secondary=modifiers,
        backref=db.backref('modifiers', lazy='dynamic'), lazy='dynamic')

我正在尝试检索基于两种或多种成分的食谱。

我能够检索具有以下单一成分的食谱:

db.session.query(models.Recipe).join(models.ModifiedIngredient, models.Recipe.ingredients).join(models.Ingredient).filter(models.Ingredient.name == 'garlic')

但是,添加多个过滤器会返回 0 个结果。这是有道理的,它是将单一成分与食谱相匹配,而一种成分不能既是大蒜又是洋葱。那么,我该如何实现呢?

【问题讨论】:

    标签: flask flask-sqlalchemy


    【解决方案1】:

    我找到的解决方案是使用相交。

    使用您的每个过滤器选项发出多个查询:

    q1 = db.session.query(models.Recipe).join(models.ModifiedIngredient, models.Recipe.ingredients).join(models.Ingredient).filter(models.Ingredient.name == 'garlic')
    
    q2 = db.session.query(models.Recipe).join(models.ModifiedIngredient, models.Recipe.ingredients).join(models.Ingredient).filter(models.Ingredient.name == 'onion')
    
    q3 = q1.intersect(q2)
    

    并且 q3 将包含同时具有“洋葱”和“大蒜”的所有项目

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多