Day 4 - 编写Model
有了ORM,我们就可以把Web App需要的3个表用 Model 表示出来:
import time, uuid
from orm import Model, StringField, BooleanField, FloatField, TextField
def nextid():
return '%015d%s000' % (int(time.time() * 1000), uuid.uuid4().hex)
class User(Model):
table = 'users'
id = StringField(primarykey=True, default=nextid, ddl='varchar(50)')
email = StringField(ddl='varchar(50)')
passwd = StringField(ddl='varchar(50)')
admin = BooleanField()
name = StringField(ddl='varchar(50)')
image = StringField(ddl='varchar(500)')
createdat = FloatField(default=time.time)
class Blog(Model):
__table = 'blogs'
id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
user_id = StringField(ddl='varchar(50)')
user_name = StringField(ddl='varchar(50)')
user_image = StringField(ddl='varchar(500)')
name = StringField(ddl='varchar(50)')
summary = StringField(ddl='varchar(200)')
content = TextField()
created_at = FloatField(default=time.time)
class Comment(Model):
__table = 'comments'
id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
blog_id = StringField(ddl='varchar(50)')
user_id = StringField(ddl='varchar(50)')
user_name = StringField(ddl='varchar(50)')
user_image = StringField(ddl='varchar(500)')
content = TextField()
created_at = FloatField(default=time.time)
在编写ORM时,给一个Field增加一个 default 参数可以让ORM自己填入缺省值,非常方便。并且,缺省值可以作为函数对象传入,在调用 save() 时自动计算。
例如,主键 id 的缺省值是函数 next_id ,创建时间 created_at 的缺省值是函数 time.time ,可以自动设置当前日期和时间。
日期和时间用 float 类型存储在数据库中,而不是 datetime 类型,这么做的好处是不必关心数据库的时区以及时区转换问题,排序非常简单,显示的时候,只需要做一个 float 到 str 的转换,也非常容易。