项目完成,做一下简单的Django实践总结
前言
这段时间刚刚完成了一个网站项目,因为规模不大,因此全部使用Django完成,我也借此机会,掌握了更多有关Django的用法,有关本次积累的经验将在本文中总结。
模型设计
Django自带功能强大的ORM系统,可以方便的设计出复杂的数据库结构,不过好像只支持关系式数据库,有第三方的NoSQL方案,不过似乎不如自己封装。
关于模型设计,对于关系式数据库,有一个简单的原则:想清楚再开始!
每次修改了数据库结构都需要做Migrate
,已有数据的数据库做改动容易引起各种错误(熟练之后很好避免),不过对于刚刚接触不久的同学来说,很多坑还是要踩的。
关于字段choices的用法
之前用到choices的时候都是这样写:
type = models.IntegerField(choices=(
(1, '类型一'),
(2, '类型二'),
(3, '类型三'),
))
UNAUTHORIZED = 0
AUTHENTICATING = 1
AUTHORIZED = 2
REALNAME_STATUS = (
(UNAUTHORIZED, '未认证'),
(AUTHENTICATING, '正在申请实名认证,等待审核'),
(AUTHORIZED, '已认证'),
)
realname_status = models.IntegerField('实名认证状态', choices=REALNAME_STATUS)
然后choices不是定义了一个中文名嘛,我们如何获取到这个名字呢,很简单:
model_object.get_realname_status_display()
model_object
就是模型的对象,形式就是 get_字段名_display()
。
关于verbose_name的使用
我建议,每个字段都用上verbose_name,这样方便自己不说,交付的时候不用花很多时间去解释各个字段是干嘛的,别人一看就清楚了。
除了 - ManyToManyField - OneToOneField - ForeignKey
这几个引用字段之外,其他类型的字段第一个参数就是verbose_name,这几个类型的字段要手动指定这个参数,像这样:
user = models.OneToOneField('User', verbose_name='对应用户', on_delete=models.CASCADE)
related_name的使用
一开始我没理解related_name这个参数是什么意思,后面才发现原来DjangoORM这么好用,这个设计其实挺好的,related_name这个参数是用来做引用的反向查询的,举个例子:
一个用户模型,被文章、视频、音乐这些很多个模型作为外键引用了,我现在只有一个用户对象,怎么获取到用户发表过的文章、视频、音乐呢,DjangoORM提供了一种简单有效的方式,就是通过不同的related_name去查询。
使用的时候就是:
user_object.user_videos.all()
user_videos
就是在视频模型里面定义好的 related_name
了~