1. 程式人生 > >Flask中定義模型類的幾種情況

Flask中定義模型類的幾種情況

datetime hash avatar register sso boolean tar review login

from datetime import datetime from werkzeug.security import generate_password_hash, check_password_hash from utils import constants from . import db class BaseModel(object): """模型基類,為每個模型補充創建時間與更新時間""" create_time = db.Column(db.DateTime, default=datetime.now) # 記錄的創建時間 update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 記錄的更新時間 # 用戶收藏表,建立用戶與其收藏新聞多對多的關系 tb_user_collection = db.Table( "info_user_collection", db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True), # 新聞編號 db.Column("news_id", db.Integer, db.ForeignKey("info_news.id"), primary_key=True), # 分類編號 db.Column("create_time", db.DateTime, default=datetime.now) # 收藏創建時間 ) tb_user_follows = db.Table( "info_user_fans", db.Column(‘follower_id‘, db.Integer, db.ForeignKey(‘info_user.id‘), primary_key=True), # 粉絲id db.Column(‘followed_id‘, db.Integer, db.ForeignKey(‘info_user.id‘), primary_key=True) # 被關註人的id ) class User(BaseModel, db.Model): """用戶""" __tablename__ = "info_user" id = db.Column(db.Integer, primary_key=True) # 用戶編號 nick_name = db.Column(db.String(32), unique=True, nullable=False) # 用戶昵稱 password_hash = db.Column(db.String(128), nullable=False) # 加密的密碼 mobile = db.Column(db.String(11), unique=True, nullable=False) # 手機號 avatar_url = db.Column(db.String(256)) # 用戶頭像路徑 last_login = db.Column(db.DateTime, default=datetime.now) # 最後一次登錄時間 is_admin = db.Column(db.Boolean, default=False) signature = db.Column(db.String(512)) # 用戶簽名 gender = db.Column( # 訂單的狀態 db.Enum( "MAN", # 男 "WOMAN" # 女 ), default="MAN") # 當前用戶收藏的所有新聞 collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic") # 用戶收藏的新聞 # 用戶所有的粉絲,添加了反向引用followed,代表用戶都關註了哪些人 followers = db.relationship(‘User‘, secondary=tb_user_follows, primaryjoin=id == tb_user_follows.c.followed_id, secondaryjoin=id == tb_user_follows.c.follower_id, backref=db.backref(‘followed‘, lazy=‘dynamic‘), lazy=‘dynamic‘) # 當前用戶所發布的新聞 news_list = db.relationship(‘News‘, backref=‘user‘, lazy=‘dynamic‘) @property def password(self): raise AttributeError("當前屬性不可讀") @password.setter def password(self, value): self.password_hash = generate_password_hash(value) def check_passowrd(self, password): return check_password_hash(self.password_hash, password) def to_dict(self): resp_dict = { "id": self.id, "nick_name": self.nick_name, "avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "", "mobile": self.mobile, "gender": self.gender if self.gender else "MAN", "signature": self.signature if self.signature else "", "followers_count": self.followers.count(), "news_count": self.news_list.count() } return resp_dict def to_admin_dict(self): resp_dict = { "id": self.id, "nick_name": self.nick_name, "mobile": self.mobile, "register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"), } return resp_dict class News(BaseModel, db.Model): """新聞""" __tablename__ = "info_news" id = db.Column(db.Integer, primary_key=True) # 新聞編號 title = db.Column(db.String(256), nullable=False) # 新聞標題 source = db.Column(db.String(64), nullable=False) # 新聞來源 digest = db.Column(db.String(512), nullable=False) # 新聞摘要 content = db.Column(db.Text, nullable=False) # 新聞內容 clicks = db.Column(db.Integer, default=0) # 瀏覽量 index_image_url = db.Column(db.String(256)) # 新聞列表圖片路徑 category_id = db.Column(db.Integer, db.ForeignKey("info_category.id")) user_id = db.Column(db.Integer, db.ForeignKey("info_user.id")) # 當前新聞的作者id status = db.Column(db.Integer, default=0) # 當前新聞狀態 如果為0代表審核通過,1代表審核中,-1代表審核不通過 reason = db.Column(db.String(256)) # 未通過原因,status = -1 的時候使用 # 當前新聞的所有評論 comments = db.relationship("Comment", lazy="dynamic") def to_review_dict(self): resp_dict = { "id": self.id, "title": self.title, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "status": self.status, "reason": self.reason if self.reason else "" } return resp_dict def to_basic_dict(self): resp_dict = { "id": self.id, "title": self.title, "source": self.source, "digest": self.digest, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "index_image_url": self.index_image_url, "clicks": self.clicks, } return resp_dict def to_dict(self): resp_dict = { "id": self.id, "title": self.title, "source": self.source, "digest": self.digest, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "content": self.content, "comments_count": self.comments.count(), "clicks": self.clicks, "category": self.category.to_dict(), "index_image_url": self.index_image_url, "author": self.user.to_dict() if self.user else None } return resp_dict class Comment(BaseModel, db.Model): """評論""" __tablename__ = "info_comment" id = db.Column(db.Integer, primary_key=True) # 評論編號 user_id = db.Column(db.Integer, db.ForeignKey("info_user.id"), nullable=False) # 用戶id news_id = db.Column(db.Integer, db.ForeignKey("info_news.id"), nullable=False) # 新聞id content = db.Column(db.Text, nullable=False) # 評論內容 parent_id = db.Column(db.Integer, db.ForeignKey("info_comment.id")) # 父評論id parent = db.relationship("Comment", remote_side=[id]) # 自關聯 like_count = db.Column(db.Integer, default=0) # 點贊條數 def to_dict(self): resp_dict = { "id": self.id, "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"), "content": self.content, "parent": self.parent.to_dict() if self.parent else None, "user": User.query.get(self.user_id).to_dict(), "news_id": self.news_id, "like_count": self.like_count } return resp_dict class CommentLike(BaseModel, db.Model): """評論點贊""" __tablename__ = "info_comment_like" comment_id = db.Column("comment_id", db.Integer, db.ForeignKey("info_comment.id"), primary_key=True) # 評論編號 user_id = db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True) # 用戶編號 class Category(BaseModel, db.Model): """新聞分類""" __tablename__ = "info_category" id = db.Column(db.Integer, primary_key=True) # 分類編號 name = db.Column(db.String(64), nullable=False) # 分類名 news_list = db.relationship(‘News‘, backref=‘category‘, lazy=‘dynamic‘) def to_dict(self): resp_dict = { "id": self.id, "name": self.name } return resp_dict

Flask中定義模型類的幾種情況