Python 炼金术;按外键列表筛选查询

Python 炼金术;按外键列表筛选查询,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我的postgres db有类别和产品。一个类别可以有许多产品。我正在尝试获取属于多个类别列表的产品(full_tree是类别id的列表)。我尝试的查询似乎不起作用,因为它们总是返回数据库中的所有产品,即筛选部分似乎不起作用 谁能帮我指出我做错了什么?或者显示执行此类查询的最佳实践 我的班级: class Parent_product(SearchableMixin, db.Model): __searchable__ = ['name'] id = db.Column(db.I

我的postgres db有类别和产品。一个类别可以有许多产品。我正在尝试获取属于多个类别列表的产品(full_tree是类别id的列表)。我尝试的查询似乎不起作用,因为它们总是返回数据库中的所有产品,即筛选部分似乎不起作用

谁能帮我指出我做错了什么?或者显示执行此类查询的最佳实践

我的班级:

class Parent_product(SearchableMixin, db.Model):
    __searchable__ = ['name']
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String)

    manufacturer_id = db.Column(db.Integer, db.ForeignKey('manufacturer.id'))
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))

class Category(db.Model, BaseNestedSets):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(400), index=True, unique=True)
    products = db.relationship("Parent_product", backref='category', lazy='dynamic')
我的问题是:

def products(parent_category = None):
    # init query
    my_query = Parent_product.query

    if parent_category:

        # Find selected category from db
        category = Category.query.filter_by(name = parent_category).first()

        # Get list of all category id's to be used in query
        full_tree = []
        full_tree.append(category.id)
        for children in category.get_children():
            full_tree.append(children.id)

        # Add filter to query
        my_query.filter_by(category_id = Category.id.in_(full_tree))

    # Execute query, get list of products, paginate
    products = my_query.paginate('PAGE', 'PRODUCTS_PER_PAGE', False)
Query.filter\u by()
用于对主要实体或作为
Query.join()目标的最新实体进行简单的相等性检查。如果需要更复杂的谓词,请使用
Query.filter()
。在那种情况下

my_query.filter_by(category_id = Category.id.in_(full_tree))
将按照

来自母公司产品p,c类
其中p.category_id=(c.id在(…)中)
这是否会产生错误取决于正在使用的DBMS。PostgreSQL会抱怨,但举例来说,SQLite会很高兴地执行它。但是,在您的情况下,这并不重要,因为您不会在任何地方分配新查询。SQLAlchemy
Query
对象是可生成的,对它们的操作将返回新的查询

因此,修复方法是将新查询分配给一个名称,并且不在查询中包含
类别
表:

my_query = my_query.filter(Parent_product.category_id.in_(full_tree))
Query.filter\u by()
用于对主要实体或作为
Query.join()目标的最新实体进行简单的相等性检查。如果需要更复杂的谓词,请使用
Query.filter()
。在那种情况下

my_query.filter_by(category_id = Category.id.in_(full_tree))
将按照

来自母公司产品p,c类
其中p.category_id=(c.id在(…)中)
这是否会产生错误取决于正在使用的DBMS。PostgreSQL会抱怨,但举例来说,SQLite会很高兴地执行它。但是,在您的情况下,这并不重要,因为您不会在任何地方分配新查询。SQLAlchemy
Query
对象是可生成的,对它们的操作将返回新的查询

因此,修复方法是将新查询分配给一个名称,并且不在查询中包含
类别
表:

my_query = my_query.filter(Parent_product.category_id.in_(full_tree))

非常感谢你。这看起来是正确的方法。我到家后会测试。只是想知道问题的第二部分。有没有更有效的方法来执行这种类型的查询?另一个问题。当我执行两步查询时,首先设置过滤器,然后在后面的步骤中执行查询,不会应用过滤器。当我将过滤器移动到执行行中时,它会工作。有没有关于为什么两步方法不起作用的指针?您是否记得在应用过滤器后为新查询指定一个名称?非常感谢。这看起来是正确的方法。我到家后会测试。只是想知道问题的第二部分。有没有更有效的方法来执行这种类型的查询?另一个问题。当我执行两步查询时,首先设置过滤器,然后在后面的步骤中执行查询,不会应用过滤器。当我将过滤器移动到执行行中时,它会工作。有没有关于为什么两步方法不起作用的指针?您是否记得在应用过滤器后为新查询指定一个名称?