测试开发进阶(二十二)
- 2019 年 10 月 10 日
- 筆記
在 projects/models.py
中编写
from django.db import models class Person(models.Model): """ 创建Person类 """ first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
- 每个应用下的数据库模型类,需要在当前应用下的models.py文件中定义
- 一个数据库模型类相当于一个数据表(Table)
- 一个数据库模型类需要基础Model或者其子类
- 定义的一个类属性,就相当于数据库表中的一个字段(
first_name
,last_name
) - 默认会创建一个自动递增的id主键
- 默认创建的数据库名为:应用名小写_数据库模型类小写
修改数据库远程连接权限
GRANT ALL PRIVILEGES ON * . * TO '你的用户名'@'%' IDENTIFIED BY '你的密码';
我这边使用
GRANT ALL PRIVILEGES ON * . * TO 'my_django'@'%' IDENTIFIED BY '123456';
刷新数据库
flush privileges;
![](https://ask.qcloudimg.com/http-save/yehe-5837399/tqqplgidx9.jpeg)
![](https://ask.qcloudimg.com/http-save/yehe-5837399/yvk8ukje3s.jpeg)
迁移
![](https://ask.qcloudimg.com/http-save/yehe-5837399/fby7k6m16a.jpeg)
$ makemigrations projects $ migrate projects
![](https://ask.qcloudimg.com/http-save/yehe-5837399/bouimon87g.jpeg)
迁移结果查看
![](https://ask.qcloudimg.com/http-save/yehe-5837399/9cp70wdcz4.jpeg)
字段
max_length
最大长度unique
设置当前参数唯一verbose_name
设置人性化的字段名help_text
用于API文档中的中文名null
允许为空black
设置前端可以不传递default
设置默认值
class Projects(models.Model): """ 创建Projects模型类 """ name = models.CharField(verbose_name='项目名称', max_length=200, unique=True, help_text='项目名称') leader = models.CharField(verbose_name='负责人', max_length=50, help_text='负责人') tester = models.CharField(verbose_name='测试人员', max_length=50, help_text='测试人员') programer = models.CharField(verbose_name='开发人员', max_length=50, help_text='开发人员') publish_app = models.CharField(verbose_name='发布应用', max_length=50, help_text='发布应用') desc = models.TextField(verbose_name='简要描述', help_text='简要描述', blank=True, default='', null=True)
查看新表
![](https://ask.qcloudimg.com/http-save/yehe-5837399/5g8mj8ly50.jpeg)
查看表设计
![](https://ask.qcloudimg.com/http-save/yehe-5837399/bq1j97lpqd.jpeg)
修改数据表名称
在 Projects
类中添加
db_table
表名verbose_name
:在admin站点中人性化展示verbose_name_plural
:复数显示(对照英文在单词后面+s)
class Meta: db_table = 'tb_projects' verbose_name = '项目' verbose_name_plural = '项目'
再次迁移
$ makemigrations projects $ migrate projects
迁移前:
![](https://ask.qcloudimg.com/http-save/yehe-5837399/zc5afm77d0.jpeg)
迁移后(点击刷新):
![](https://ask.qcloudimg.com/http-save/yehe-5837399/7q50wokv5u.jpeg)
后台站点
注册站点
projects/admin.py
from django.contrib import admin from .models import Projects, Person admin.site.register(Projects) admin.site.register(Person)
全部迁移
$ makemigrations $ migrate
![](https://ask.qcloudimg.com/http-save/yehe-5837399/tjwjlzmk19.jpeg)
![](https://ask.qcloudimg.com/http-save/yehe-5837399/b3mk880zmq.jpeg)
访问admin
http://127.0.0.1:8000/admin
![](https://ask.qcloudimg.com/http-save/yehe-5837399/uingszd9dm.jpeg)
创建管理员账户
$ createsuperuser
![](https://ask.qcloudimg.com/http-save/yehe-5837399/h8g95bfwe5.jpeg)
![](https://ask.qcloudimg.com/http-save/yehe-5837399/i560bjzotl.jpeg)
![](https://ask.qcloudimg.com/http-save/yehe-5837399/6mu4nqhz5i.jpeg)
让图中的 Persons
变为中文:修改 projects.models.Person
保存后刷新页面
class Person(models.Model): """ 创建Person类 """ first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class Meta: verbose_name = '人' verbose_name_plural = '人们'
![](https://ask.qcloudimg.com/http-save/yehe-5837399/zh0nu2ifok.jpeg)
添加一个项目:
![](https://ask.qcloudimg.com/http-save/yehe-5837399/0dmicksrhc.jpeg)
查看数据表
![](https://ask.qcloudimg.com/http-save/yehe-5837399/nytb5wkd3x.jpeg)
![](https://ask.qcloudimg.com/http-save/yehe-5837399/7wybgrstxi.jpeg)
为了让他显示的更人性化在 projects.models.Projects
中添加:
def __str__(self): return self.name
![](https://ask.qcloudimg.com/http-save/yehe-5837399/mudyklrm73.jpeg)
修改展示的部分
fields
指定在修改「新增」中需要显示的字段list_display
指定要列出的字段
from django.contrib import admin from .models import Projects, Person class ProjectsAdmin(admin.ModelAdmin): """ 定制后台管理站点类 """ fields = ('name', 'leader', 'tester', 'programer', 'publish_app', 'desc') list_display = ['id', 'name', 'leader', 'tester'] admin.site.register(Projects, ProjectsAdmin) admin.site.register(Person)
![](https://ask.qcloudimg.com/http-save/yehe-5837399/e4t3y6q89m.jpeg)
表关联
创建一个应用
![](https://ask.qcloudimg.com/http-save/yehe-5837399/b1nb92677s.jpeg)
$ startapp interfaces
注册子应用
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'projects.apps.ProjectsConfig', 'interfaces.apps.InterfacesConfig', ]
在 interfaces/models.py
中编写
*一个项目中有多个接口 那么需要在「多」的一侧创建外键 *
项目表为父表「一」,接口表为「多」子表
class Interfaces(models.Model): name = models.CharField(verbose_name='项目名称', max_length=200, unique=True, help_text='项目名称') tester = models.CharField(verbose_name='测试人员', max_length=50, help_text='测试人员') desc = models.TextField(verbose_name='简要描述', help_text='简要描述', blank=True, default='', null=True) project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, verbose_name='所属项目', help_text='所属项目') class Meta(): verbose_name = 'a'
对于:
project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, verbose_name='所属项目', help_text='所属项目')
第一个参数
字符串
:关联的模型路径或者模型类「应用名.模型类」 -> 'projects.Projects'对象
:import导入from projects.models import Projects -> Projects
第二个参数
设置的是:当父表删除之后,该字段的处理方式
models.CASCADE
:子表也会被删除models.SET_NULL
:当前外键会被设置为Nonemodels.PROTECT
:会报错models.SET_DEFAULT
:设置默认值,同时需要指定默认值,null=True
数据库操作
使用Pycharm自带的 PythonConsole
就可以进入Django的shell模式
使用 python manage.py shell
也可以进入
![](https://ask.qcloudimg.com/http-save/yehe-5837399/7wz7ne62b1.jpeg)
from projects.models import Projects Projects.objects.all() Out[3]: <QuerySet [<Projects: 测试游记>, <Projects: 测试游记1>]> Projects.objects.get(id=1) Out[4]: <Projects: 测试游记> Projects.objects.get(id=1).name Out[5]: '测试游记' Projects.objects.get(id=1).tester Out[6]: 'zx'
查看数据库操作记录
from django.db import connection print(connection.queries)
增
one_obj = Projects(name='「测试游记」-创建', leader='zx_94', tester='zx', programer='zx', publish_app='公众号', desc='666') one_obj.save()
![](https://ask.qcloudimg.com/http-save/yehe-5837399/qjfkdz4b9z.jpeg)
数据库操作记录
print(connection.queries[-1]) {'sql': "INSERT INTO `tb_projects` (`name`, `leader`, `tester`, `programer`, `publish_app`, `desc`) VALUES ('「测试游记」-创建', 'zx_94', 'zx', 'zx', '公众号', '666')", 'time': '0.003'}