FLASK开源项目--派生吧博客推介之四

这一部分主要介绍博客的数据库以及定义的常用的查询函数,这一部分代码主要在model.py里面。博客的数据库主要包含category,tag,tags,post,comment五张表。现在分别对这五张表以及相关的查询函数进行解析:


  • category


category(分类表),主要储存了博客的分类,表项只有id(自增)以及name(唯一).


		
              class Category(db.Model):
                     __tablename__ = 'category'     #表名
                     query_class = CategoryQuery    #指定的查询类名
                     id = db.Column(db.Integer, primary_key=True)  #id
                     category_name = db.Column(db.String(200), unique=True)  #name
    
                     #下面的内容可以自由选择
                     def __init__(self, category_name):
                         self.category_name = category_name

                     def __repr__(self):
                         return '' % self.category_name



 查询只要定义了两个函数getall以及getcategory_id:getall()获取所有的分类,getcategory_id(id)获取指定id

 的分类。


	
		 class CategoryQuery(BaseQuery):
                     def getall(self):
                         return self.all()

                     def getcategory_id(self, id):
                         return self.get(id)
        



  • tags


tags(文章标签映射表),主要存储了文章id与标签的id的对应关系,存储文章的时候,该表会自动进行更新。


	article_tags = db.Table('tags',
                        db.Column(
                            'tag_id', db.Integer, db.ForeignKey('tag.id')),
                        db.Column(
                            'post_id', db.Integer, db.ForeignKey('post.id')),
                        )
        



  • tag


tag(标签表),主要存储了文章的标签,表只有id(自增)以及name。


		class Tag(db.Model):
                    __tablename__ = 'tag'    #表名
                    query_class = TagQuery   #指定的查询类名
                    id = db.Column(db.Integer, primary_key=True)     #id
                    name = db.Column(db.String(50))                  #name

                    def __init__(self, name):
                        self.name = name

                    def __repr__(self):
                        return '' % self.name



 查询只要定义了两个函数getall以及gettag_id:getall()获取所有的标签,gettag_id(id)获取指定id

 的标签。


		 class TagQuery(BaseQuery):

                     def getall(self):
                         return self.all()

                     def gettag_id(self, id):
                         return self.get(id)



  • post


post(文章表),主要存储了博客的文章内容以及相关的分类以及标签信息,表只有id(自增)、post_content、post_title、post_create_time、view_num、comment_count、status、author_id、post_modified_time、category_id、post_name、tags_name(id,文章内容,文章标题,文章创建时间,阅读次数,评论数量,文章状态,作者id,文章修改时间,分类id,网址的缩写名称,标签名称)。


		class Post(db.Model):
                    __tablename__ = 'post'   #表名
                    query_class = PostQuery  #指定的查询类名
                    id = db.Column(db.Integer, primary_key=True)  #id
                    post_content = db.Column(db.Text)             #文章内容
                    post_title = db.Column(db.String(100))        #文章标题
                    post_name = db.Column(db.String(200), unique=True)    
                    #文章的网址的缩写,主要用于文章的网址以便于SEO优化
                    post_create_time = db.Column(db.DateTime, default=datetime.utcnow)  
                    #文章创建时间
                    view_num = db.Column(db.Integer, default=0)    #阅读次数
                    comment_count = db.Column(db.Integer, default=0)     #评论次数
                    status = db.Column(db.Integer, default=1)            #文章状态
                    author_id = db.Column(db.Integer, default=1)         #作者id,默认是1 
                    post_modified_time = db.Column(db.DateTime, default=datetime.utcnow)
                    #文章的修改时间
                    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))   #类型id
                    categorys = db.relationship('Category', backref=db.backref( 
                    'posts', lazy='dynamic'), lazy='select')      #定义与category表之间的关系    
                    tags = db.relationship('Tag', secondary=article_tags,
                           backref=db.backref('posts', lazy='dynamic'))   #定义域tag表之间的关系 

                    def __init__(self, tags, post_content, post_title, category_id,  post_name,
                                 post_create_time=None, view_num=0, comment_count=0, status=1,
                                 author_id=1, post_modified_time=None):
                        self.post_content = post_content
                        self.post_title = post_title
                        self.category_id = category_id
                        self.post_name = post_name
                        if post_create_time is None:
                            self.post_create_time = datetime.utcnow()
                        self.view_num = view_num
                        self.comment_count = comment_count
                        self.status = status
                        self.author_id = author_id
                        if post_modified_time is None:
                            self.post_modified_time = post_modified_time
                        self.tags = tags

                  def __repr__(self):
                        return '' % self.post_title

                  def _url(self):
                        return url_for('post', name=self.post_name)

                  @cached_property
                  def url(self):
                        return self._url()

                  @cached_property
                  def comments(self):
                        allcomments = Comment.query.filter(Comment.post_id == self.id).all()
                        return allcomments




    查询定义了七个函数:getpost_id、getall、getpost_byname、getpost_perpage、hottest、newpost、search:

    getpost_id(id):获取指定id的文章;

    getall():获取所有的文章;

    getpost_byname(name):获取指定postname的文章;

    getpost_perpage():用于分页显示所有文章;

    hottest():根据浏览次数以及评论次数来排序文章;

    newpost():根据文章修改时间来排序文章;

    search():查找函数,主要用于标题,内容,标题以及类别。


class PostQuery(BaseQuery):

    def getpost_id(self, id):
        return self.get(id)

    def getall(self):
        return self.all()

    def getpost_byname(self, name):
        return self.filter(Post.post_name.ilike(name)).distinct().first()

    def getpost_perpage(self, pageid, per_page):
        return self.order_by(Post.post_modified_time.desc(),
                            Post.post_create_time.desc()).paginate(pageid, per_page)

    def hottest(self):
        return self.order_by(Post.comment_count.desc(), Post.view_num.desc())

    def newpost(self):
        return self.order_by(Post.post_create_time.desc())

    def search(self, keywords):
        criteria = []
        for keyword in keywords.split():
            keyword = '%' + keyword + '%'
            criteria.append(db.or_(Post.post_title.ilike(keyword),
                                   Post.post_content.ilike(keyword)))

        q = reduce(db.and_, criteria)

        return self.filter(q).distinct()



  • comment


comment(评论表),主要存储评论相关信息,表项有:id,post_id,author,author_email,author_url,author_ip,comment_create_time,content,isvisible。


class Comment(db.Model):
    __tablename__ = 'comment'   #表名
    query_class = CommentQuery  #指定的查询类名
    id = db.Column(db.Integer, primary_key=True)   #id
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))   #文章id
    posts = db.relationship('Post', backref=db.backref('comments', lazy='dynamic'))    
    #定义post与comment之间的关系
    author = db.Column(db.String(50))                                      #作者名  
    author_email = db.Column(db.String(100))                               #作者email 
    author_url = db.Column(db.String(1024))                                #作者url
    author_ip = db.Column(db.String(20))                                   #作者ip
    comment_create_time = db.Column(db.DateTime, default=datetime.utcnow)   #评论创建时间
    content = db.Column(db.Text)                                            #评论内容 
    isvisible = db.Column(db.Integer, default=1)                            #评论是否可见

    def __init__(self, postid, author, author_email, author_url, author_ip,
                 content, isvisible=1, comment_create_time=None):
        self.post_id = postid
        self.author = author
        self.author_email = author_email
        self.author_url = author_url
        self.author_ip = author_ip
        self.content = content
        self.isvisible = isvisible
        if comment_create_time is None:
            self.comment_create_time = datetime.utcnow()

    def __repr__(self):
        return '' % self.content




查询定义了三个函数:getall,getcomment_id以及newcomment。


class CommentQuery(BaseQuery):

    def getall(self):
        return self.all()

    def getcomment_id(self, id):
        return self.get(id)

    def newcomment(self):
        return self.order_by(Comment.comment_create_time.desc())