我的 postgres 数据库有类别和产品类。一个类别可以有多个产品。我正在尝试获取属于多个类别列表的产品(full_tree 是类别 id 的列表)。我尝试的查询似乎不起作用,因为它们总是返回数据库中的所有产品,即过滤部分似乎不起作用。
谁能帮我指出我做错了什么?或者展示执行此类查询的最佳实践?
我的类(class):
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_by()
用于针对主要实体或作为 Query.join()
目标的最新实体进行简单的相等性检查。如果您需要更复杂的谓词,请使用Query.filter()
。从这个角度来看
my_query.filter_by(category_id = Category.id.in_(full_tree))
将按照以下方式生成 SQL
FROM parent_product p, category c
WHERE p.category_id = (c.id IN (...))
是否会产生错误取决于所使用的 DBMS。 PostgreSQL 会提示,但例如 SQLite 会很乐意执行它。但是,在您的情况下,这并不重要,因为您没有在任何地方分配新查询。 SQLAlchemy Query
对象是生成性的,对它们的操作会返回新的查询。
因此解决方法是为新查询分配一个名称,并且不在查询中包含 Category
表:
my_query = my_query.filter(Parent_product.category_id.in_(full_tree))
关于python - Flask-sqlalchemy;通过外键列表过滤查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62342285/