day02-django模型层
Djiango的Model模型介绍
1.模型是我们项目中的数据信息源,它包含着存储数据的必要字段和行为
2.通常,每个模型对应数据库中的一张表,每个属性对应一个字段
3.每个模型都是django.db.models.Model的一个Python子类(为什么要继承这个类?因为这个类中封装好了数据库的增删改查的操作 ,无需我们自己再去写相关的操作方法)
4.Django提供一套自动生成的用于数据库访问的API
5.模型与数据库的关系时ORM关系(对象-关系-映射)
6.为什么要用模型?
Model时MVC框架中重要的一部分,负责在数据库中存取数据
它实现了数据模型与数据库的解耦,即不需要依赖于特定的数据库通过简单的配置就可轻松的更换数据库
Model的开发流程
1.在应用的models.py中定义模型类,要求继承自models.Model
2.把应用加入到项目setting.py配置文件的INSTALLED_APPS项中
3.生成迁移文件
python manage.py makemigrations
4.执行迁移
python manage.py migrate
5.使用模型类进行CRUD操作
定义Model模型
1.在模型中定义属性,会生成表中的字段
2.Django根据属性的类型确定以下信息:
当前选择的数据库支持的字段类型
渲染管理表单时使用的默认html控件
在管理站点最低限度的验证
3.Django会为表增加自动增长的主键列,每个模型只能有一个主键列。
4.属性命名限制
不是Python的保留关键字
由于Django的查询方式,不允许使用连续的下划线
Model模型的实例
模型实例对象时通过objects属性获取,即Django为模型类提供的管理器
object:时Manager类型的对象,用于与数据库进行交互
实例的方法:
__ str __(self):重写object方法,此方法在将对象转换成字符串时会调用
save():将模型对象保存到数据表中
delete():将模型对象从数据表中删除
Django的模型层
Model模型
模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。
通常,每个模型对应数据库中唯一的一张表。
- 每个模型都是django.db.models.Model的一个Python 子类。
- 模型的每个属性都表示为数据库中的一个字段。
- Django 提供一套自动生成的用于数据库访问的API;
- 这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳
模型与数据库的关系
模型(Model)负责业务对象和数据库的关系映射(ORM)
ORM是“对象-关系-映射”的简称,主要任务是:
- 根据对象的类型生成表结构
- 将对象、列表的操作,转换为sql语句
- 将sql查询到的结果转换为对象、列表
为什么要用模型?
Model是MVC框架中重要的一部分,主要负责程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据
它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库
配置Mysql数据库
登录连接MySQL数据库,并创建数据库mytest。
create databases mytest default charset=utf8
在Django框架中使用MySQL数据库需要加载 MySQLdb模块,也就是需要安装 mysqlclient,若已经安装请略过。
$ pip install mysqlclient
在现有的Django项目中的配置数据库连接信息
修改settings.py文件中的DATABASE配置项DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'mytest',#选择数据库的名,请确认你的mysql中有这个库'USER': 'root','PASSWORD': 'root','HOST': 'localhost','PORT': '3306',} }
开发流程
在models.py中定义模型类,要求继承自models.Model
from django.db import models from datetime import datetime# Create your models here. class Users(models.Model):#id = models.AutoField(primary_key=True) #主键可省略不写name = models.CharField(max_length=32)age = models.IntegerField(default=20)phone = models.CharField(max_length=16)addtime=models.DateTimeField(default=datetime.now)#class Meta: # db_table = "myapp_users" # 指定表名
把应用加入settings.py文件的installed_app项
编辑myweb/settings.py文件,并将项目应用文件名添加到该INSTALLED_APPS设置。INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','myapp', #或全称:myapp.apps.MyappConfig ]
生成迁移文件
python manage.py makemigrationsdjango.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No mo dule named 'MySQLdb'. Did you install mysqlclient or MySQL-python? 安装上面"配置Mysql数据库"的第五步配置,或安装:pip install mysqlclient后就可以了若执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py再 python manage.py makemigrations 生成原先的model对应的migration file
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uf853xFW-1646213828014)(C:\Users\ZCR\AppData\Roaming\Typora\typora-user-images\image-20220227141443817.png)]
执行迁移
python manage.py migrate
使用模型类进行crud操作(具体详见第二小节)
定义模型
- 在模型中定义属性,会生成表中的字段
- django根据属性的类型确定以下信息:
- 当前选择的数据库支持字段的类型
- 渲染管理表单时使用的默认html控件
- 在管理站点最低限度的验证
- django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
- 属性命名限制
- 不能是python的保留关键字
- 由于django的查询方式,不允许使用连续的下划线
定义属性
- 定义属性时,需要字段类型
- 字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中
- 使用方式
- 导入from django.db import models
- 通过models.Field创建字段类型的对象,赋值给属性
- 对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False
字段类型
AutoField
:一个根据实际ID自动增长的IntegerField,通常不指定
- 如果不指定,一个主键字段将自动添加到模型中
BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
NullBooleanField:支持null、true、false三种值
CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
IntegerField:整数
DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
- DecimalField.max_digits:位数总数
- DecimalField.decimal_places:小数点后的数字位数
FloatField:用Python的float实例来表示的浮点数
DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
- 参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
- 参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
- 该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
- auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
FileField:一个上传文件的字段
ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
字段选项
- 通过字段选项,可以实现对字段的约束
- 在字段对象时通过关键字参数指定
- null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
- blank:如果为True,则该字段允许为空白,默认值是 False
- 对比:null是数据库范畴的概念,blank是表单验证证范畴的
- db_column:字段的名称,如果未指定,则使用属性的名称
- db_index:若值为 True, 则在表中会为此字段创建索引
- default:默认值
- primary_key:若为 True, 则该字段会成为模型的主键字段
- unique:如果为 True, 这个字段在表中必须有唯一值
关系
- 关系的类型包括
- ForeignKey:一对多,将字段定义在多的端中
- ManyToManyField:多对多,将字段定义在两端中
- OneToOneField:一对一,将字段定义在任意一端中
- 可以维护递归的关联关系,使用’self’指定,详见“自关联”
- 用一访问多:对象.模型类小写_set
bookinfo.heroinfo_set
- 用一访问一:对象.模型类小写
heroinfo.bookinfo
- 访问id:对象.属性_id
heroinfo.book_id
元选项
在模型类中定义类Meta,用于设置元信息
元信息db_table:定义数据表名称,推荐使用小写字母,
数据表的默认名称:<app_name>_<model_name>
例如myweb_users
ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
class BookInfo(models.Model):...class Meta():ordering = ['id']
字符串前加-表示倒序,不加-表示正序
class BookInfo(models.Model):...class Meta():ordering = ['-id']
排序会增加数据库的开销
示例演示
- 创建test2项目,并创建booktest应用,使用mysql数据库
- 定义图书模型
class BookInfo(models.Model):btitle = models.CharField(max_length=32)bpub_date = models.DateTimeField()bread = models.IntegerField(default=0)bcommet = models.IntegerField(default=0)isDelete = models.BooleanField(default=False)
- 英雄模型
class HeroInfo(models.Model):hname = models.CharField(max_length=32)hgender = models.BooleanField(default=True)isDelete = models.BooleanField(default=False)hcontent = models.CharField(max_length=100)hbook = models.ForeignKey('BookInfo')
- 定义index、detail视图
- index.html、detail.html模板
- 配置url,能够完成图书及英雄的展示
测试数据
- 模型BookInfo的测试数据
insert into booktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0)
- 模型HeroInfo的测试数据
insert into booktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0)
day02-django模型层相关推荐
- Web开发-Django模型层
Django模型层 简述 Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删) 可以看到,Django自带了一套ORM机制,这也是Django框架的核心-"全面",将一 ...
- Django基础五之Django模型层(二)多表操作
Django基础五之Django模型层(二)多表操作 一 创建模型 表和表之间的关系 一对一.多对一.多对多 # 作者表 比较常用的信息放在这个表中 class Author(models.Model ...
- Django 模型层(models) 复杂查询详解
Django 模型层(models) 复杂查询详解 一般Django orm 和原生sql混合使用 1.测试文件 只单独测试django中的某一个py文件 不一定是tests.py 1.配置 在任意一 ...
- Django–模型层orm查询
文章目录 Django–模型层orm查询 一.单表查询(增.删.改.查) 基本查询 下划线查询 二.外键字段(增.删.改.查) 一对多 多对多 三.多表查询 多表查询的方式 正反向的概念 基于对象的跨 ...
- 3.1.8 Django模型层详细应用
在这里肯定有小伙伴会说,前面不是已经引用了模型层了吗?并且在模型层中完成了数据库的操作了呀,为什么还要讲模型层? 首先呢,前面属于我们最传统的处理方式,那种方式过于麻烦,无法很好处理数据.模型层真正应 ...
- python代码函数字符查询宝典书籍_Django基础五之django模型层(一)单表操作
二 单表操作 一.创建表 创建模型 创建名为book的app,在book下的models.py中创建模型: from django.db importmodels#Create your models ...
- Django模型层Meta内部类详解
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应 ...
- Django 模型层(1)
知识预览 ORM简介 单表操作 章节作业 回到顶部 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单 ...
- 9 Django 模型层(2)
多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...
- 8 Django 模型层(2)
知识预览 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型 ...
最新文章
- Linux中断处理驱动程序编写【转】
- linux下创建proc文件系统,[转载]Linux下的proc文件系统(转载)
- mysql 结构对比工具_Mysql 数据库结构 对比工具
- msp430入门学习30
- lambda Kappa iota比较
- 一句命令删除docker所有镜像或容器
- 字符串的各种格式转换,C#中自动为数字千位数,百万位数添加逗号
- android 自定义水波纹点击效果Button
- Jmeter之线程组(默认)
- php在页面中实现累加,小白问个php累加问题
- DataGrid的ViewState
- Zabbix监控Jenkins过程详解
- WinRAR 5.60 无广告正式版
- Intellij IDEA之Mybatis插件:Free Mybatis Plugin
- taxi计费器c语言程序,基于单片机的出租车计费器的设计(附实物图,原理图,程序)...
- Excel函数公式大全—VLOOKUP函数
- 计算机专业博士阶段研究方向,国内计算机专业博士研究方向
- 关于微信公众平台本地测试ip如何加入IP白名单
- uniapp 旅游_uni-app旅游类跨平台APP制作实战教程
- 【附源码】Python计算机毕业设计社区生鲜电商平台