项目完成,做一下简单的Django实践总结

前言

这段时间刚刚完成了一个网站项目,因为规模不大,因此全部使用Django完成,我也借此机会,掌握了更多有关Django的用法,有关本次积累的经验将在本文中总结。

模型设计

Django自带功能强大的ORM系统,可以方便的设计出复杂的数据库结构,不过好像只支持关系式数据库,有第三方的NoSQL方案,不过似乎不如自己封装。

关于模型设计,对于关系式数据库,有一个简单的原则:想清楚再开始! 每次修改了数据库结构都需要做Migrate,已有数据的数据库做改动容易引起各种错误(熟练之后很好避免),不过对于刚刚接触不久的同学来说,很多坑还是要踩的。

关于字段choices的用法

之前用到choices的时候都是这样写:

type = models.IntegerField(choices=(
        (1, '类型一'),
        (2, '类型二'),
        (3, '类型三'),
))
这样写的话粗看没什么问题,但是在调用,在views里面做判断的时候问题就来了,我怎么记得1234分别对应什么意思,每次写是不是都要查看一下模型里面怎么写的,严重降低开发效率。 应该这样写:
    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这个参数是什么意思,后面才发现原来DjangoORM这么好用,这个设计其实挺好的,related_name这个参数是用来做引用的反向查询的,举个例子:

一个用户模型,被文章、视频、音乐这些很多个模型作为外键引用了,我现在只有一个用户对象,怎么获取到用户发表过的文章、视频、音乐呢,DjangoORM提供了一种简单有效的方式,就是通过不同的related_name去查询。

使用的时候就是:

user_object.user_videos.all()
这个 user_videos 就是在视频模型里面定义好的 related_name 了~