Python 如果记录具有与其相关的外键对象,则过滤SQLAlchemy对象中的记录

Python 如果记录具有与其相关的外键对象,则过滤SQLAlchemy对象中的记录,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,使用以下示例: 如何构造一个查询来获取所有有帖子的类别 希望执行类似操作,但请改用SQLAlchemy筛选器: >>> categories_with_post = [] >>> For c in Category.query.all(): ... if len(c.posts.all()) > 0: ... categories_with_post.append(c) 由于您只需要包含帖子的类别,因此可以尝试以下方法: fr

使用以下示例:

如何构造一个查询来获取所有有帖子的类别

希望执行类似操作,但请改用SQLAlchemy筛选器:

>>> categories_with_post = []
>>> For c in Category.query.all():
...     if len(c.posts.all()) > 0:
...         categories_with_post.append(c) 

由于您只需要包含帖子的类别,因此可以尝试以下方法:

from sqlalchemy import distinct
db.session.query(distinct(Category.id), Category).join(Post.category).all()
加入将阻止任何没有帖子的类别被返回

请注意distinct函数的用法,它将防止在多个帖子指向同一类别时重复类别。但是它不能用于Category类本身,所以我在
Category.id
属性中使用了它,并添加了
Category
作为第二个参数,以获得整个对象。它将返回(id,Category)元组列表

>>> ru = Category('Ruby')
>>> db.session.add(ru)
>>> categories_with_post = []
>>> For c in Category.query.all():
...     if len(c.posts.all()) > 0:
...         categories_with_post.append(c) 
from sqlalchemy import distinct
db.session.query(distinct(Category.id), Category).join(Post.category).all()