Flask中定義模型類的幾種情況
阿新 • • 發佈:2018-09-17
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中定義模型類的幾種情況