详解Django的Models(django基础四)
文章目录
model基础
model设计时的总结
- 设计Model的时候,可以继承自Models.model或者AbstractUser,AbstractUser是内置的用户类,当要继承内置的用户模型并进行扩展时,就使用它,Models则是通用的模型类,自定义模型都需要继承这个.
- AbstractUser要记得在setting.py里面加上AUTH_USER_MODEL = ‘users.UserProfile’
- 设计表的时候,首先要分享需要哪些表,关键是分析关系:实体1 <对于关系> 实体2,表关系是一对多,还是多对一等等,要自行分析定义外键
- 设计表的第二步是设计具体的字段,每个字段的类型是否是必填。
- 通常在我们的表里面可以加一个
add_time
属性,用来记录这条记录是什么时候添加进的,举例如下
from datetime import datetime
class BaseModel(models.Model):
add_time = models.DateTimeField(default=datetime.now,verbose_name="添加时间"
class Meta:
# 设置成抽象基类,不然Django会帮我们创建这个表
abstract = True
class Course(BaseModel):
'''这里继续写属性,已继承'''
'''外键的设置'''
class Lesson(BaseModel):
course = models.ForeignKey(Course,on_delete=models.CASCADE)
'''这里必须注意第一个参数是要关联的外键,
第二个参数是一定要写的,用来设置当Course被删除的时候,
外键怎么处理,CASCADE表示如果对应的课程被删除,那么外键的
记录也会级联的删除,而一种SET_NULL属性是指课程被删除后
这个外键这一列被置空,它必须和```null = True,blank = True```
连用,否则都不能为空怎么置空呢
orm概述
什么是ORM
- Python、PHP、Java是一种开发语言,而MySQL、SQL Server则采用数据库语言,不同语言之间如何实现互操作?
- SQL语言包括包括数据定义语言DDL、数据控制语言DCL、数据查询语言DQL、数据操作语言DML等,例如INSERT、DELETE、SELECT、UPDATE操作。
- 作为开发人员,应该把精力放在核心业务代码的编写上面,而不应该花太多精力跟数据库语言打交道。
- ORM(Object-Relational Mapping,对象关系映射)技术可以看做是开发者和数据库之间的桥梁,用于实现数据库和编程语言之间的映射,本质上来看,ORM就是将SQL操作和编程语言操作做了一个翻译。
- 通过ORM技术来操作数据库,使得开发者无需接触SQL语句,而直接操作对象的属性和方法,大大提高了开发效率。
orm的功能
- 映射技术:数据类型映射、类映射、关系映射。例如,每一张数据库表对应开发语言的类,每一个数据字段对应类中的属性。
- CRUD操作:CRUD即增删查改操作,在SQL语句中通过Insert、Select、Update、Delete来实现,在ORM库中则需要
通过对应的函数来实现,例如Django ORM通过get、filter、save、delete函数进行操作。 - 缓存优化:(惰性操作)从数据库查询到的数据以类对象的形式保存在内存,用于随时提取;真正需要查询结果时才执行数据库的select操作,而不是在ORM查询命令执行时查询数据库。
Models介绍
- 通常情况,一个Models对应数据库的一张表
- Django中Models以类的形式表现
- 它包含了一些基本字段以及数据的一些行为
- 我们只需要在类里面进行操作,就可以操作数据库,表,不需要直接使用SQL语句
- 我们通过创建类来创建数据表,所以对数据库的操作,都是对类与对类的对象进行操作,而不使用sql语句
- ORM对象关系映射,实现了对象和数据库的映射,隐藏了数据访问的细节,不需要编写SQL语句
model创建语法
form django.db import models
class Modelname(models.Model):
# 创建模型类并继承models.Model
# 一个类就是数据库的一张表
field1 = models.XXXfield(max_lenge=10,verbose_name='haha'
field = models.XXXfield()
class Meta():
# 为这个类定义一个说明
verbose_name = XXX
# 不加这个的话在我们的verbose_name在admin里面会被自动加上s
verbose_name_plural = XXX
model案例演示
效果是数据库中对应的生成一种表,这个表叫Student,且有student_name与password属性。
from django.db import model
class Student(models.Model):
student_name = models.CharField(max_length=50,verbose_name='姓名')
password = models.CharField(max_length=50,=verbose_name = '密码')
models的属性与字段(field)
1.field类型
-
AutoField:一个自动递增的整形字段,通常用于主键
-
CharField:字符串字段,用于输入较短的字符,对应与HTML里面
<input type='text'>
-
TextField:文本字段,用于输入较多的字符,对应html标签
<input type = "textarea">
; -
EmailField:邮箱字段,用于输入带有Email格式的字符
-
DateFiled
-
TimeFiled
-
DateTimeField:日期字段,支持时间输入
-
ImageField:用于上传图片并验证图片合法性,需定义upload_to参数,使用本字段需安装python pillow等图片库
-
IntegerField:整数字段,用于保持整数信息
field属性
primary_key
:设置True or False,定义此字段是否为主键default
:设置默认值,可以设置默认的文本、时间、图片、时间等null
:设置True or False,是否允许数据库字段为Null,默认为Falseblank
:设置True or False,定义是否运行用户不输入,默认为False;若为True,则用户可以不输入此字段max_length
:设置默认长度,一般在CharField、TextField、EmailField等文本字段设置verbose_name
:设置该字段的名称,所有字段都可以设置,在Web页面会显示出来(例如将英文显示为中文)choices
:设置该字段的可选值,本字段的值是一个二维元素的元祖;元素的第1个值为实际存储的值,第2个值为HTML页面显示的值upload_to
:设置上传路径,ImageField和FileField字段需要设置此参数,如果路径不存在,会自动创建
Meta类属性
verbose_name
:设置对象名称(例如usecms),若没有设置,则默认为该类名的小写分词形式,例如类名为CamelCase会被转换为camel case;verbose_name_plural
:设置对象名称复数(例如usercms),一般设置跟verbose_name一样,verbose_name_plural=verbose_name
否则会默认加s;db_table
:设置映射的数据表名,默认为“应用名_模型名”,即用该模型所在app的名称加本模型类的名称proxy
:设置True or False,设置本模型及所有继承本模型的子模型是否为代理模型;abstract
:设置True or False,设置本模型类是否为抽象基类;如果是抽象基类,那么是不会创建这张表的,这张表用来作为基类被其他的表继承
model层的命令详解
python manage.py makemigrations+名字
:# 生成数据库表的初始化文件initial.py文件
python manage.py migrate
# # 基于数据库表初始化文件initial.py文件,正式生成数据表
python manage.py sqlmigrate polls 0001
查看数据库的生成语句,因为initial.0001是数据库表的初始化文件
数据库的操作
基础操作
1.查询操作:
modelname.object.all()
取出所有的数据
modelname.object.get(pk=id)
查询出符合筛选条件数据(一条),如果查到多条或者没有查到会报错
modelname.object.filter(....)
查询出符合筛选条件的数据集(一条或者多条),如果对象不存在会返回一个空的列表,而不会报错。
ModelName.Objects.exclude( )
返会不符合筛选条件的数据集
增加操作
通过先赋值后保存的方式添加
field1 = models.CharField()
field2 = modelsEmailField()
modelname.object.save()
通过使用create的方法来添加
modelname.object.create(field1=models.CharField())
user_cms = UserCMS.objects.create(username=username, password=password)
删除操作
在查询的方法后面加上.delete()就行
排序查询操作
ModelName.Objects.all( ).order_by('xxx')
查询模型类的所有数据并且以order_by进行排序。
例子:
all_interviews = Interview.objects.all().order_by('-read_counts')
切片操作
ModelName.Objects.all( ).order_by('xxx')[a:b]
例子
all_interviews = Interview.objects.all().order_by('-read_counts')[:6]
recommended_interviews = Interview.objects.filter(company=recommended_tag).exclude(id=int(interview_id)).order_by('-read_counts')[:3]
进阶操作
表关联,一对多,多对一
外键的补充(反向查询)
Django的反向查询主要有两种方式,一个是在字段里边添加related_name,通过related_name字段去操控
Q查询与F查询
Models编写
- 在应用的根目录下创建models.py,引入models模块,通常已经帮我们自动创建好,并且文件里面已经引入了models模块,我们直接进行下一步
- 编辑models.py文件,创建一个类,一个类就是一张数据表
- 创建了表后,我们还要创建数据库的字段,我们通过编辑类中的属性来创建字段(字段等函数可以去django官网查找)
- 字段创建格式
变量名 = models.charField(max_length = 32)
这里max_length为必选参数,还有很多的可选参数
即格式为:变量名 = models.某个方法()
- 字段创建格式
- 生成数据表
- 进入manage.py同级目录
- 执行python manage.py makemigrations app名(可选),这里如果不写app名,默认都进行数据迁移
- python manage.py migrate然后数据表就会生成成功
- 执行完命令后自动生成一个migrations文件夹,打开里面的文件,可见它为我们自动创建了id字段
- 查看创建的数据库python manager.py sqlmigrate+应用名 +文件id
- 使用第三方软件(推荐SQlite)查看并编辑db.sqlite3
- 页面呈现数据(后台操作步骤)
- 在views.py中import models
- 在文件中写入我们的类:acticle=models.Acticle.objects.get(pk=1)pk=1意思是get到我们的主键的id,圈住部分将数据传到前端,前面加引号(路径要加引号),后面不加引号
- 通过render()将对象传给前端,render在前面博客有介绍
- 页面呈现数据(前端操作步骤),通过{{ }}
- 编辑html文件
更多推荐
所有评论(0)