Django—ORM(三)
一、框架
1、定义
- 把类和数据进行映射
- 通过类和对象就能操作它所对应表格中的数据(CRUD)
2、步骤
- 配置数据库连接信息
- 创建数据库和用户
- CREATE DATABASE my_django charset=utf8
- GRANT ALL PRIVILEGES ON *.* TO ROOT '@'%' IDENTIFIED BY 123456
- flush privileges
- 配置数据库 :全局setting.py中进行配置
- 创建数据库和用户
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } 'default': { #指定引擎 'ENGINE': 'django.db.backends.mysql', #指定数据库名称 'NAME': 'my_django', #数据库用户名 'USER': 'ROOT', 'PASSWORD': 'fmwan2019', 'HOST': 'localhost', 'PORT': 3306 } }
-
- 安装mysqlclient
- 在models.py定义模型类
from django.db import models # Create your models here. class Person(models.Model): """创建Person类""" first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
- 迁移
- 第一步:生成迁移初始化脚本 makemigrations [appname]


2.第二步:执行初始化脚本 migrate [appname]

在指定的数据库my_django中生成两张表:projects_migrations, projects_person;其中projects_migrations记录迁移历史记录

projects_person的字段就是models.py中定义的变量

总结:
- 每一个应用下的数据库模型类,需要再当前应用下的models.py文件中定义
- 一个数据库模型类相当于一个数据库表(table)
- 一个数据库模型类需要继承Model或Model的子类
- 定义一个类属性,就相当于数据库表中的一个字段
- django默认会创建一个自动递增的id主键
等价于 id = models.AutoField(primary_key=True)
- 通过类和对象操作完成数据增删改查操作
- 默认创建的数据表为:应用名小写_数据库模型类小写
ORM的作用

4、数据库模型解析:
models.py再新建类Projects:
class Projects(models.Model): '''Projects 模型类''' # CharField:字符串类型 # max_length:字段最大长度 # verbose_name: 用于更人性化的字段名 # unique: 默认设置当前字段是否唯一,默认为False # help_text:用于api文档中的中文名称 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='开发人员') pubish_app = models.CharField(verbose_name='应用名称', max_length=100, help_text='应用名称') # null: 设置数据库中此字段允许为空 # blank: 用于设置前端可以不传递 # default:设置默认值 desc = models.TextField(verbose_name='简要描述', help_text='简要描述', blank=True, default='', null=True) # models.IntegerField(choices=['male','female'])
进行迁移,数据库表结果如下:

-
Meta子类
用于设置当前数据模型的元数据信息
class Projects(models.Model): '''Projects 模型类''' # CharField:字符串类型 # max_length:字段最大长度 # verbose_name: 用于更人性化的字段名 # unique: 默认设置当前字段是否唯一,默认为False # help_text:用于api文档中的中文名称 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='开发人员') pubish_app = models.CharField(verbose_name='应用名称', max_length=100, help_text='应用名称') # null: 设置数据库中此字段允许为空 # blank: 用于设置前端可以不传递 # default:设置默认值 desc = models.TextField(verbose_name='简要描述', help_text='简要描述', blank=True, default='', null=True) # models.IntegerField(choices=['male','female']) #定义子类Meta class Meta: db_table = 'tb_projects'
进行迁移后,查看数据库,数据表名称一杯更改:

-
连接两张表
新建interface应用,models.py设置与projects的外联关系
from django.db import models #一个项目中有多个接口,需要在"多"的一侧创建外键 #项目表为父表("-"),接口表("多")为子表 # Create your models here. 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) #第一个参数为关联的模型路径(应用名.模型类)或者模型类 #第二个参数设置的是当父表删除之后,该字段的处理方式 #CASCADE -->子表也会被删除 #SET_NULL -->当前外键值也会被设置为NOne #PROJECT -->会报错 #SET_DEFAULT -->设置默认值,同事需要制定默认值,null=True project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE, verbose_name='所属项目', help_text='所属项目') class Meta: db_table = 'tb_interfaces' verbose_name = '接口' verbose_name_plural = '接口'
models.ForeignKey()参数说明:
#第一个参数为关联的模型路径(应用名.模型类)或者模型类
#第二个参数设置的是当父表删除之后,该字段的处理方式
#CASCADE -->子表也会被删除
#SET_NULL -->当前外键值也会被设置为NOne
#PROJECT -->会报错
#SET_DEFAULT -->设置默认值,同事需要制定默认值,null=True
迁移后,数据库表结构如图:
![]()
5、admin站点

创建超级管理员:createsuperuser

输入用户名,邮箱,密码

创建用户成功后,在auth_user表中插入了创建的超级管理员用户数据:

使用创建的超级管理员用户登录admin站点:

在应用的admin.py文件下,将应用添加到admin站点,这样就可以通过admin来访问:
from django.contrib import admin from interfaces.models import Interfaces # Register your models here. admin.site.register(Interfaces)
from django.contrib import admin from projects.models import Projects, Person # Register your models here. admin.site.register(Projects) admin.site.register(Person)
刷新页面:

在后端增加项目数据:


数据库表tb_projects插入了一条数据:

models.py增加__str__()方法
def __str__(self): return self.name
项目列表显示项目名称:

在项目列表中只显示了项目名称,如果要显示其他信息,则需要在应用的admin.py中定义一个站点管理类:
from django.contrib import admin from projects.models import Projects, Person # Register your models here. class Project_Admin(admin.ModelAdmin): """定制后台站点管理类""" #指定在修改(新增)中需要显示的字段 fields = ('name', 'leader', 'tester', 'programer', 'pubish_app') #指定需要列出的字段 list_display = ['id', 'name', 'leader', 'tester'] admin.site.register(Projects, Project_Admin) # admin.site.register(Person)
刷新页面:



浙公网安备 33010602011771号