Flask博客项目-数据模型的扩建(四)

有了用户模型,我们现在要做的就是搭建博客文章模型

如果不懂如何搭建环境,可以参考以下链接:

Pycharm社区版-创建Flask

Flask博客项目-项目的开始(一) 

如果不懂何如进行Flask拓展,可以参考以下连接(此文下方会运用到):

Flask博客项目-Shell拓展Flask_Script(二) 

如果不懂何如创建用户模型,可以参考以下连接:

Flask博客项目-数据模型的创建(三) 


我们在main.py中添加Post类:

from sqlalchemy import String,Integer,Text,DateTime
from sqlalchemy import ForeignKey

class Post(db.Model):
    id = Column(Integer(), primary_key=True)
    title = Column(String(255))
    text = Column(Text())
    publish_date = Column(DateTime())
    #这里把user表的id作为外键
    user_id = Column(Integer(), ForeignKey('user.id'))

    def __init__(self, title):
        self.title = title
    
    def __repr__(self):
        return "<Post '{}'>".format(self.title)

有了外键,那接下来当然是修改一下User和Post的关系啦

那么就对User和Post类进行处理加工:

from sqlalchemy.orm import relationship

class User(db.Model):
    id = Column(Integer(), primary_key=True)
    username = Column(String(255))
    password = Column(String(255))
    #lazy参数和backref是成对出现的
    posts = relationship('Post', backref='user', lazy='subquery')

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

    #方便Shell命令验证
    def __repr__(self):
        return "<User '{}'>".format(self.username)

 backref参数可以使我们通过Post.user属性对User对象进行读取和修改


同时,我们添加了Comment类以及Tag类,使我们提交的文章有了评论和文章标签

from sqlalchemy import Table
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

tags = Table(
    'post_tags', Base.metadata,
    Column('post_id', Integer(), ForeignKey('post.id')),
    Column('tag_id', Integer(), ForeignKey('tag.id'))
)

class Post(db.Model):
    id = Column(Integer(), primary_key=True)
    title = Column(String(255))
    text = Column(Text())
    publish_date = Column(DateTime())
    comments = relationship('Comment', backref='post', lazy='dynamic')
    user_id = Column(Integer(), ForeignKey('user.id'))
    tags = relationship('Tag', secondary=tags, backref=backref('posts')) 
    
    def __init__(self, title):
        self.title = title
    
    def __repr__(self):
        return "<Post '{}'>".format(self.title)

class Comment(db.Model):
    id = Column(Integer(), primary_key=True)
    name = Column(String(255))
    text = Column(Text())
    date = Column(DateTime())
    post_id = Column(Integer(), ForeignKey('post.id'))
    
    def __repr__(self):
        return "<Comment '{}'>".format(self.text[:15])


class Tag(db.Model):
    id = Column(Integer(), primary_key=True)
    title = Column(String(255))

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

    def __repr__(self):
        return "<Tag '{}'>".format(self.title)

 


点击此处查看Git源码


此次项目最难的点在于一对一,一对多,多对多的复杂关系:

一对多:

                 子类表:foreignkey   引用父类表

                 父类表:relationship 链接子类表

一对一:

                 父类表:relationship 链接子类表的时候,

                 使用backref函数,并在函数中加上参数(uselist=False)来表示

多对多:

                 子类表:foreignkey   引用父类表

                 父类表:relationship 链接子类表的时候,

                 要在两个表之间增加一个关联的表,这个表在relationship函数中通过(参数secondary)来表示关联的表

父关系relationship是个函数,而子关系只出现在表创建的Column函数里面

猜你喜欢

转载自blog.csdn.net/weixin_41836765/article/details/83929997
今日推荐