2:测试平台之DB构建

之前的写的太乱了,重新整一篇

这里先用Django自带的数据库:sqlite的情况,实现建表,页面读取表数据并操作。

核心命令:migrate------翻译为"迁移"。是不是感觉很奇怪,但是这个是个强大的功能,之后表加字段什么的,无需编写语句,在构建表的模型中直接添加字段即可。

1:新项目无DB数据的情况------从0建表

(1)绘制model

我们现在已经创建了一个项目demo1010以及一个app:app1010.对于这个app下,想建表,需要在app下的models.py文件中,构建model.

(与db相关的操作都在model中)

建一张DB表为一个类,编写表中的字段名和类型默认值等,表的主键id可以不用写(migrate的时候会自动新增)。对于表的一些复杂操作等,可以用类下的方法来实现,类继承了Django下的Models模型。
这里我创建了2个类(DB新建2个表,表Question和表Choice)

Question表有字段"question_text"和"pub_date",其中定义了方法was_published_recently,用于判断发布时间是不是一天之内的,返回布尔值。

在这里重写了model自带的__str__方法,调用自身的时候返回的是对应的question_text.

表:Choice有3个字段,其中把Question作为表的外键,question与choice为1对多;choice_text继续选项名,votes记录投票数,之后可以对votes进行投票自增操作。

2:注册app

绘制完model,需要执行让整个项目知道这个DB呀。但是项目怎么知道DB呢。

之前篇幅,介绍了项目下的SETTINGS文件,存放了项目的配置等,那么必然有DB配置,看看。

看着只是指定了用哪种DB(后面我们切MySQL用的到),貌似本次无关,在看看别的配置,发现有个installedapp.

我们执行migrate的时候,项目读取文件的installed_app列表,从上往下依次读取app,然后看他们是否有db改动需要迁徙。项目创建的时候就默认把项目自带的一些框架系统进行了注册。这里再添加上我们的app------app1010,放的是app下的apps.py文件中的类名。指向app的配置类。(上图最后一行我已经加上了)

打开这个文件一看,果然记录了一些DB的model配置,本次暂不修改。

3:migrations

接着我们查看项目文件,发现咱之前新建app的时候,就连带着有个migrations文件夹,里面就一个__init.py的空文件(这个文件的存在是为了告知项目这个是个文件夹)。

那么DB构建的核心命令migrate,和这个文件夹的命名,看上去还是有关联的对吧?(就是有关系)

我们进入终端,运行命令

python 复制代码
python manage.py makemigrations

项目会根据installedapp,判断是否有model变更,有的话生成对应的migrations文件(这个文件是为了方便我们阅读即将进行的db操作),仅此而已,不进行别的操作。

这时核对migrations文件夹,发现多了一个文件,查看。

文件命名是从0001开始计数往下的。文件名也好阅读,就是初始化操作。

确认无误后操作迁徙。

python 复制代码
python manage.py migrate

会对所有的apps进行迁移动作。

如果想指定app操作,在命令后面加上app名称即可

python 复制代码
python manage.py migrate app1010

结果返回成功,这表明DB表已经构建完成。这时可以核对。

核对方式有两种,1:进入shell编程模式,操作DB;2:页面核对(虽然暂未写页面逻辑,但是框架提供了admin后面,前面migrate的时候也把admin给带上了,后面弄个账号就行)

4:核对DB-shell

进入shell模式,新建一条question数据

注意,这里写的时候,需要引入的包还是要重新引入。

这个时候表中就有一条question数据了,注意,任何的变更操作都是临时的,必须保存之后才生效。上述成功之后再核对。

如果用Question访问,类继承了父类的objects方法,获取set对象,get方法里面的pk是主键的意思,question表的主键是id,可以用"Question.objects.get(id=7)",也可以直接用pk(primary key的缩写)

有人执行结果是

这是默认的结果,我返回的是question_text,因为我在model中重写了__str__方法

那么choice怎么创建??有外键怎么关联

默认逻辑是有了question,通过question会获取到choice_set(命名规则是类名_set),是个集合,然后添加这个集合

其他用法详见文档,暂不赘述。https://docs.djangoproject.com/zh-hans/5.2/intro/tutorial02/

5:核对DB------网页显示

django自带了一个admin交互后台,这个我们之前在installed_apps以及migrate操作都看到过。看url配置,进入admin后台

http://localhost:8000/admin/

需要配置管理员账密

进入后台即可看到数据。但是没有我们的question和choice,因为没有注册。

在app文件夹下有个admin.py,就是处理这个管理后台,只有注册的model才能进入后台管理。

有数据了,后面可以直接页面操作,页面也会记录操作历史(shell的操作不会进入admin后台的操作历史,两套逻辑)。

2:有数据的情况下db变更

比如说,question表加个note字段,可以为空。

先修改models

然后migration一下,看下正确与否。无误后migrate

每次migrations,如果有变更,都会在migrations文件夹下增加一个文件,这次也是。

OKK,DB也有了,路径也配了,接下来可以愉快的写页面了。

3、网页编写

页面需要放在templates文件夹下,在app下面新建个文件夹,templates,下面存在html。

但是实际我们一个项目会有多个app,可能存在html重名,url解析路径的时候,找到多个就用第一个,所以最好的方式,就是在templates下加一个文件夹,命名为这个app的名称,把html都放在这个下面,url路径访问的时候,加上appname就行了。

路径访问增加的appname,配置在app下的url文件中,

html就不放了,网页操作先自己雕花写个标题啥的都行,关键的得是路由配置。

我们知道输入网址,先是url截取解析,找到urls.py中配置的path,然后匹配对应的view(视图逻辑),然后视图的展示,我们可以写一些页面跳转逻辑等,指向页面A,B,C,D。在templates中写具体的页面ABCD的样式)。
那么第一步:Url配置。

path("index/", views.index, name="index"),
第二步:view视图指向。

python 复制代码
def index(request):
    #按照发布时间升序,挑选最后5条(也就是时间最晚的5条)
    #lastest_question_list = Question.objects.order_by("pub_date")[-5:]
    # 按照发布时间倒序,挑选前5条(也就是时间最晚的5条)
    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    print(latest_question_list)
   # output = ",".join([q.question_text for q in lastest_question_list])
    template = loader.get_template("apps/index.html")
    context = {"latest_question_list":latest_question_list}
    return HttpResponse(template.render(context,request))

第三步:html配置

建一个html页面。其实在view的时候,跳转过去就传了context,也就是latest_question_list,在HTML中,可以遍历list并显示

.

相关推荐
测试老哥5 小时前
Postman环境变量设置全攻略
自动化测试·软件测试·python·测试工具·职场和发展·接口测试·postman
胜天半月子6 小时前
接口测试 | 使用Postman实际场景化测试
测试工具·接口测试·postman
〆WangBenYan゜7 小时前
postman 调用接口设置全局变量
测试工具·lua·postman
程序员小远13 小时前
软件测试之压力测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
大面积秃头14 小时前
postman工具使用前置知识
测试工具·postman
程序员大辉14 小时前
接口调试利器,Postman免安装,免登陆
测试工具·lua·postman
星哥说事15 小时前
网络监控工具:ping、traceroute、nmap、Wireshark 网络探测与分析
网络·测试工具·wireshark
歪歪1002 天前
使用 Wireshark 进行 HTTP、MQTT、WebSocket 抓包的详细教程
网络·websocket·测试工具·http·wireshark