Django建生物类数据库心得

Wed 15 January 2020 By ppt123

前言

去年被委托了建一个数据库,因为周边有很多计算机的朋友,就去询问了一下用什么建站比较好,因为我平时处理数据一直在写python,朋友就各种说php早就过气了,不如试试django。然后我脑子一抽就入了这个坑,学了大半个月连皮毛大概都没抓全,好在有朋友的细心答疑解惑(他说以后再也不瞎jb安利我了),数据库总算今年成功发表了,这里稍微整理整理用django架生物类数据库的心得(注,不是教程),供想入坑的童鞋们参考。

先大声说三遍,如果你不想折腾,请不要使用django来架站,老老实实回去学php

关于http请求/应答

学bioinformatics的同学们都知道,我们专业有个不成文的规则,编程基本不看书,直接上手写实例,边写边看书学的是最快的。但是写网页不服从这个规则。在学习写网站后台之前,必须要认真学习一下http请求和应答。在谷歌搜索http请求,就能搜到一堆所谓“深入浅出”的讲解,我这里就不详细说了。

具体学到一个什么程度开始可以看django了呢?主要是需要了解几种常见的请求方式,以及参数是怎么传递给服务器的,以及应答的几种方式,比如说什么是重定向,什么是404。

关于Django可用功能的概括

终于上手学django的时候,首先推荐两个教程,一个是英文的原版documentation,另一个是国内翻译过来的博客刘江的Django教程。如果有时间的话强烈建议先通读一遍中文教程,大概了解各个层是干什么的,然后再开始上手。

那么就像我朋友最开始跟我说的,django是个全家桶,功能非常的全面,我们搭一个普通的生物学database显然用不到这么多的功能,我这里稍微讲讲一些需要重点学习以及使用的功能。

模型层

django完全封装好了和数据库通信的一整套api,完全不需要学习sql语言,但这并不意味着不需要学习数据库的基础知识。对于数据库的组织结构,什么是主键外键,这些都是必须了解的,因为我们的网站既然本质叫生物数据库,那它最重要的就是数据库的设计以及存储。

关于查询

有个东西叫Q

from django.db.models import Q

想AND的时候可以Q(A)&Q(B),想OR的时候可以Q(A)|Q(B)。

如果你嫌参数过多,甚至可以先初始化一个query,然后把条件一个一个连起来,最后再查表

query = Q()
if(a == b):
    query = query | Q(condition)
else:
    query = query & Q(condition)    

关于app与model

看到网上一些实例都是专门建一个app来存model,每个基础应用就直接引用该app下面的model。然后如果有个别应用有特别function specific的model的话,也会在该应用下单独搞个model。

关于外键与多对多关系

Django有一套看起来很好用的关系模型,但是实际操作起来并没有非常好用。对于生物数据库来说,很多时候只需要一些简单的查询操作,很多关联字段并不一定需要外键以及多对多关系来联系起来。对于这部分数据,其实可以使用普通字段。

比如说,我某个条目可能有多篇引用文献,那么我该条目的pubmed字段就可以使用文本格式,然后把多个pubmed id使用分号来隔开。至于取用的时候,可以使用python的split函数再把这些id分开,再对每个pmid进行查表。这样的效率虽然可能比不上直接进行联表查询。但是维护表中数据的时候会异常的方便。相信我,一旦中间表太多,有时候想删除修改部分数据都异常的麻烦。

聚合函数太慢了,尤其是涉及到多对多关系就会特别慢,使用的时候务必慎重

反正大概的原则是,不能因为多对多比较优雅,让自己维护变得异常麻烦。毕竟我们数据库是以发文章为目的,发了文章谁有那么多工夫来维护网站。

视图层

最重要的层,没有之一。

所以不细讲了,所有的内容,都很重要。

关于异步与json

强调,异步是个好东西,一定要用。

后台针对异步,无非是主网页写一个view函数,ajax请求的json单写一个函数用来返回json。将返回的json存成一个大字典,然后用JsonResponse直接返回就可以把字典转成json格式了。

模板层

是数据库的最外层,和前端接洽的。

我因为学的比较菜,所有网站的模板都是独立写的,没有搞模板套模板。后来看大佬们都是先写base.html然后其他都套用该模板,可以省很多事,比方说万一突然要改navbar这种所有网页都有的元件,只修改base.html就可以了(我的话是写了个vim宏然后一个文件一个文件进去改,一点都不优雅)。所以强烈建议初学者看看别人怎么套的base,然后扒过来(

关于表单

django的表单模板感觉超级难用,如果可以的话强烈建议使用前端完成。

还有就是,反正好多数据库都不需要登录,能用GET就用GET,非常好用(

关于前端后台的取舍

有的时候我们想实现一些功能前端后台都能实现,这时候就要进行取舍,虽然django功能很全,但是不是什么事都用后台来处理都很好。

使用后台一般都需要发送http请求, 并进行查表,如果要进行大数据量的查询是比较快的。但如果只是小规模的网页变动,javascript依然是最佳选择。对于我们这种研究组架网站,往往是一个人两头抓,又写前端又写后台,那么双修都要学好。不能觉得django功能强大,就尽量所有功能全用后台来完成。实际在架站的过程中往往是正相反的,能用javascript的东西都尽量用javascript,反而是后台只有在需要大量的查表排序操作的时候才会使用。

另外就是一定要巧用异步,能用异步的地方就异步,可以让人觉得网站用起来很舒服,而不是一加载个网页就要半天。尤其是生物类数据库往往经常需要很耗时间的查表,异步的话会大大优化使用体验。

主要就是这些,如果哪天又想起来什么的话再补充,祝大家架站愉快(手动滑稽