Flask中定义模型类的几种情况

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

原文地址:http://blog.51cto.com/13914991/2175870

时间: 2024-10-31 14:43:28

Flask中定义模型类的几种情况的相关文章

领域模型中的实体类分为四种类型:VO、DTO、DO、PO

http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布

Flask之自定义模型类

4.3自定义模型类 定义模型 模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库. 类中的属性对应数据库表中的列.id为主键,是由Flask-SQLAlchemy管理.db.Column类构造函数的第一个参数是数据库列和模型属性类型. 如下示例:定义了两个模型类,作者和书名. #coding=utf-8 from flask import Flask,render_templ

转:领域模型中的实体类分为四种类型:VO、DTO、DO、PO

经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析.得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除二者之外需要进行传递的数据.一.实体类百度百科中对于实体类的定义如下:实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关.根据以上定义,我们可以了解到,实体类有两方面内容,存储数据和执行

javascript中定义声明函数的四种方法

javascript中定义声明函数的四种方法 :http://blog.163.com/zzf_fly/blog/static/209589158201286104927248/ 方法一:function functionName([parameters]){functionBody}; 方法二:将一个未命名的函数function赋给一个指定变量(var):var add=function(a, b){} 方法三:使用new运算符声明函数varName=new Function([param1N

在C++中定义接口类,在C#中实现

网上大部分都是C#调用C++的接口,很少有C++调用C#的,更少有在C++中定义接口类,在C#中实现. 千辛万苦,终于找到一个网址:http://www.tuicool.com/articles/AFjY7j 简单翻译一下, class __declspec(dllexport) CSimpleClass { public: int value; CSimpleClass(int value) : value(value) { } ~CSimpleClass() { printf("~CSimp

合成的默认构造函数定义为delete的一种情况

1. 默认初始化 如果定义变量时没有指定初值,则变量会被默认初始化,此时变量被赋予了"默认值". 对于类类型的变量来说,初始化都是依靠构造函数来完成的.因此,即使定义某个类的变量(对象)时没有提供初始化式,我们也能通过类的默认构造函数来完成初始化.即,"默认值"由默认构造函数来决定(前提是该类有默认构造函数). 对于内置类型的变量来说,当定义没有初始化式的变量时,系统有时会帮我们初始化变量."默认值"由定义的位置决定:定义于任何函数体之外的变量被

django定义模型类

模型类被定义在应用文件夹下的model.py中 模型类必须继承Django的models.Model类 属性名不能用连续的两条下划线__ 主键:primary key,简写 pk 不需要主动定义,django会自动生成自增长的主键,属性名叫 id, 如果开发者自己定义了主键,则django不会再生成默认的主键 格式: 属性名=models.字段类型(字段选项) 字段类型: 类型 说明 AutoField 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建名为id的自

4.2 在SELinux策略中定义客体类

一个策略中一定要包含被SELinux内核和其他客体管理器支持的所有客体类和权限的声明.通常来说,我们作为策略编写者,不用担心创建新的客体类.然而,我们需要理解被定义的客体类来编写出更有效率的SELinux策略.理解客体类和权限声明语法是非常有用的,因为特允许我们理解我们正在使用的策略版本支持的客体类和权限. 添加一个新的客体类和权限 添加一个新的客体类和在一个存在的客体类上修改权限非常复杂的工作,这项工作通常只能在修改系统代码本身的时候进行.不像SELinux策略语言的其他方面,客体类和权限在L

如何使用其他文件中定义的类Python

我在文件a.py中定义了一个类class A(object),现在想在b.py中的类B中某个函数中创建一个A的对象,需要如何操作呢? 我在b的头加了import a.py然后使用语句 obj = A()总是报错http://hi.baidu.com/kxw102/item/bbc7db11a863e00ab88a1a0c 正确的方法应该是:from a import A 下面我们来看看具体的原理:python中是通过名称空间来定位的.import a 是将a这个模块引入, 名称是a:也可以imp