Подсчет связанных элементов в модели 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

Другие вопросы по тегам