加入并计入sql-alchemy

Mar*_* M. 3 python sqlalchemy

我有一个如此定义的模型:

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    authors = db.relationship('Author', secondary=articles_authors, backref=db.backref('articles', lazy='dynamic'))
    tags = db.relationship('Tag', secondary=articles_tags, backref=db.backref('articles', lazy='dynamic'))
    comments = db.relationship('Comment', backref=db.backref('article'), lazy='dynamic')
    creation_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    modification_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    title = db.Column(db.String(256), nullable=False)
    contents = db.Column(db.Text, nullable=False)
Run Code Online (Sandbox Code Playgroud)

我想创建一个查询,它会给我所有与作者和标签相关联的文章,并且会计算与给定文章相关的评论.这就是我到目前为止所知道的:

Article.query.options(db.joinedload(Article.authors), db.joinedload(Article.tags)).all()
Run Code Online (Sandbox Code Playgroud)

给我带来麻烦的是计数部分 - 我找不到任何关于如何做的例子.那我该怎么做?

编辑:

查询不起作用,但感觉正确的方向:

subquery = db.session.query(Comment.article_id, func.count(Comment.id).label('comments_count'))\
            .group_by(Comment.article_id).subquery()

return db.session.query(Article, subquery.c.comments_count)\
    .outerjoin(subquery, Article.id == subquery.c.article_id)\
    .join(Tag).all()
Run Code Online (Sandbox Code Playgroud)

在这种情况下计数部分工作正常,但我没有得到使用此查询的标签和作者.

EDIT2:

如果它不明显 - 文章和标签之间的关系是多对多的:

articles_tags = db.Table('articles_tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('article_id', db.Integer, db.ForeignKey('article.id'))
)
Run Code Online (Sandbox Code Playgroud)

文章和作者也是如此.

编辑:

答案:

subquery = db.session.query(Comment.article_id, func.count(Comment.id).label('comments_count'))\
            .group_by(Comment.article_id).subquery()

return db.session.query(Article, subquery.c.comments_count)\
    .outerjoin(subquery, Article.id == subquery.c.article_id)\
    .options(db.joinedload(Article.authors), db.joinedload(Article.tags)).all()
Run Code Online (Sandbox Code Playgroud)

ada*_*rsh 6

我认为你在找什么可能是这样的(?)

(
    session.query(Article, func.count(Comment.id))
    .select_from(Comment)
    .join(Comment.article)
    .group_by(Article)
)
Run Code Online (Sandbox Code Playgroud)

要获得作者和标签,您应该只能使用.authors.tagsArticle对象上.要急切地加载它,您可以使用joinedload或subqueryload.

编辑:

(
    session.query(Article, func.count(Comment.id))
    .select_from(Comment)
    .join(Comment.article)
    .options(db.joinedload(Article.authors), db.joinedload(Article.tags))
    .group_by(Article)
)
Run Code Online (Sandbox Code Playgroud)