Подсчет связанных элементов в модели sqlalchemy
Я пытаюсь подсчитать количество элементов в соответствующих категориях и получить коллекцию, которую я могу перебрать в шаблоне jinja. Мой окончательный вывод что-то вроде:
категория1, 5
категория 2, 10
категория 3, 0
Случай с нулевыми элементами важен.
Моя модель:
class Category(Base):
__tablename__ = 'category'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True)
user_id = Column(Integer, ForeignKey('user.id'))
user = relationship(User)
class Item(Base):
__tablename__ = 'item'
id = Column(Integer, primary_key=True)
name = Column(String(80))
description = Column(String(500))
category_id = Column(Integer, ForeignKey('category.id'))
category = relationship(Category)
user_id = Column(Integer, ForeignKey('user.id'))
user = relationship(User)
date_added = Column(DateTime, default=datetime.datetime.now)
Мне было любезно указано в направлении Stackru: подсчет отношений в SQLAlchemy, что привело меня к запросу
count_categories = db_session.query(Category.name, func.count(Item.id)).join(Item.category).group_by(Category.id).all()
Что почти правильно, но это не относится к нулевому случаю. Когда в категории нет элементов, мне все еще нужна категория, возвращаемая запросом.
Любая помощь, высоко ценится.
1 ответ
Решение
На самом деле, я понял это:
count_categories = db_session.query(
Category.name, func.count(Item.id)).outerjoin(
Item).group_by(Category.id).all()
Смотрите документацию по SQLAlchemy в Joins