sqlalchemy通过comments_articles表计算与文章相关的一级嵌套的注释

时间:2014-02-19 09:18:25

标签: python database count sqlalchemy relationship

现在我使用以下方法来获取与文章相关的评论计数。 但是当我在文章中有N个评论时,它太冒险了。 如何在sqlalchemy中使用一级嵌套计数注释? P.S Comment不仅用于文章模型,还用于其他模型(Project,Page,Something ..)

class Article(db.model)
    ...
    ...ORM definitions...
    def comment_count(self):
        count = 0
        for comment in self.comments.filter(Comment.subs.any()).all():
            count += comment.subs.count()
        count += self.comments.count()
        return count

评论与文章有关。 在上面的代码中,self是一篇有很多评论的文章。 这两个模型通过comments_articles表相关。 表的ORM定义如下所示。

comments_articles = db.Table('comments_articles',
                       db.Column('article_id', db.Integer, db.ForeignKey('article.id'), nullable=False),
                       db.Column('comment_id', db.Integer, db.ForeignKey('comment.id'), nullable=False))

class Comment(db.Model):
    """Comment model"""
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'), nullable=False)
    main_id = db.Column(db.Integer, db.ForeignKey('comment.id'))
    level = db.Column(db.SmallInteger, default=0)
    content = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    main = db.relationship('Comment', remote_side=[id], uselist=False,
                       backref=db.backref('subs', lazy='dynamic', cascade="all, delete-orphan", single_parent=True,
                                          order_by='desc(Comment.created_at)'))


class Article(db.Model):
    """Article model"""
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    description = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    comments = db.relationship('Comment', secondary=comments_articles, lazy='dynamic',
                           backref=db.backref('article', uselist=False), cascade="all, delete-orphan",
                           passive_deletes=True, single_parent=True, order_by='desc(Comment.created_at)')

1 个答案:

答案 0 :(得分:0)

from sqlalchemy import func
session.query(func.count(Comment.subs)).filter(Comment.subs != None)

我假设如果Comment.subs中没有任何内容,那就是None