Django之modles(模型)

定义属性

概述

·django根据属性的类型确定以下信息

·当前选择的数据库支持字段的类型

·渲染管理表单时使用的默认html控件

·在管理站点最低限度的验证

 django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列

·属性命名限制

·遵循标识符规则

·由于django的查询方式,不允许使用连续的下划线

 库

·定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models

·使用方式

·导入from django.db import models

·通过models.Field创建字段类型的对象,赋值给属性

逻辑删除

·对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False

字段类型

·AutoField

·一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中

·CharField(max_length=字符长度)

·字符串,默认的表单样式是 TextInput

·TextField

·大文本字段,一般超过4000使用,默认的表单控件是Textarea

·IntegerField

·整数

·DecimalField(max_digits=None, decimal_places=None)

·使用pythonDecimal实例表示的十进制浮点数

·参数说明

·DecimalField.max_digits

·位数总数

·DecimalField.decimal_places

·小数点后的数字位数

·FloatField

·用Pythonfloat实例来表示的浮点数

·BooleanField

·true/false 字段,此字段的默认表单控制是CheckboxInput

·NullBooleanField

·支持nulltruefalse三种值

·DateField([auto_now=False, auto_now_add=False])

·使用Pythondatetime.date实例表示的日期

·参数说明

·DateField.auto_now

·每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false

·DateField.auto_now_add

·当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false

·说明

·该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键

·注意

·auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果

·TimeField

·使用Pythondatetime.time实例表示的时间,参数同DateField

·DateTimeField

·使用Pythondatetime.datetime实例表示的日期和时间,参数同DateField

·FileField

·一个上传文件的字段

·ImageField

·继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image

字段选项

·概述

·通过字段选项,可以实现对字段的约束

·在字段对象时通过关键字参数指定

·null

·如果为TrueDjango 将空值以NULL 存储到数据库中,默认值是 False

·blanke

·如果为True,则该字段允许为空白,默认值是 False

·注意

·null是数据库范畴的概念,blank是表单验证证范畴的

·db_column

·字段的名称,如果未指定,则使用属性的名称

·db_index

·若值为 True, 则在表中会为此字段创建索引

·default

·默认值

·primary_key

·若为 True, 则该字段会成为模型的主键字段

·unique

·如果为 True, 这个字段在表中必须有唯一值

关系

·分类

·ForeignKey:一对多,将字段定义在多的端中

·ManyToManyField:多对多,将字段定义在两端中

·OneToOneField:一对一,将字段定义在任意一端中

·用一访问多

·格式

·对象.模型类小写_set

·示例

grade.students_set

·用一访问一

·格式

·对象.模型类小写

·示例

·grade.students

·访问id

·格式

·对象.属性_id

·示例

·student.sgrade_id

创建模型类
元选项:

说明:在模型类中Meta类,用于设置元信息

有两个属性:

db_table  -----   定义数据表名,(表名,默认为应用名.类名)

ordering ----  对象的默认排序字段(获取对象的列表时使用)

ordering[字段]            ---

ordering[-字段] ---

模型成员

类属性(objects--也可以叫做管理器

Manager类型的一个对象,作用是与数据库存进行交互

当定义模型类时,没有指定管理器,则Django则为模型创建名为objects的管理器

例:Students.objects.all()  ---访问所有数据

自定义模型管理器(即是创建了一个Manager对象)

models.py

当自定义后,则默认的objects就不存在了

自定义管理器Manager类(models.py中)

模型管理器是Django的模型进行与数据库交互的接口,一个模型可以有多个模型管理器

作用:

1、向管时哭喊中添加额外的方法

2、修改管理器返回的原始查询集

例如:重写里面的方法:get_querset()方法

这样就可以自定义查询的数据结果了

Students.stuObj.all()

创建对象(views.py中用于添加数据)

目的: 用于向数据库中添加数据

当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时,才与数据库交互,将对象保存到数据库中。

注意:__init__方法已经在父类models.Model中使用,在自定义的模型中无法使用(即不能写__inint__

创建对象方法:

1,在模型类中增加类方法

2,在自定义管理器添加一个方法

方式一(models.py增加类方法)

然后:

http://localhost:8000/addstudents/   -------浏览器中执行(添加学生)

http://localhost:8000/students/     ---浏览器中执行(查看学生)

方式二(自定义管理器类添加个方法)

urls.py 中新增:

views.py中新增对应的视图类:

models.py中自定义管理器类(添加代码):

http://localhost:8000/students2/    --- 添加对象

http://localhost:8000/students/ --- 查看

模型查询

概念:

查询集:从数据库中获取的对象的集合。

查询集可以多个过滤器

过滤器就是一个函数。基于这个函数中的参数,去限制查询的范围条件

查询集 == select * from xxx

过滤器 === where 子句

1,可以在管理器中调用方法,

可以写成链式调用,即多个过滤器

惰性执行:

创建查询集不会有产生任何数据的访问,只有调用时,才会有访问

直接访问数据的情况也是有的(非惰性):

一种是迭代,

另一种是序列化

再一种是与if合用

返回查询集

返回查询集的方法称为过滤器:

all()  --- 返回查询集中的所有数据,返回的是对象

filter() -- 返回符合条件的数据(以下都是且的关系)

filter(=)

filter(=值,键=)   

filter(=).filter(=)

exculde() -- 过滤掉符合条件的数据

values()  --- 一条数据就是一个对象(字典样式),返回一个列表(多个对象)

返回单个数据:

get()       --- 返回一个满足条件的对象,

注意:

如果没有找到符合条件的对象,则会引发模型类DoesNotExist异常

如果找到多个对象,也会引发模型类MultipleObjectsReturned异常

count()

first()

last()

exists()

限制查询集:

--返回的也是列表,可以使用下标的方法进行限制,等同于MYSQL中的limit() ORACLE中的rownum

1:显示前5个学生

例2:分页显示,每页显示5

查询的缓存:

概述:

每个查询集都包含一个缓存,来最小化的对数据库访问。

在新建的查询集中缓存首次为空。第一次以查询集求值(就是访问数据),会发生数据的缓存。Django会将查询出来的数据做缓存,并返回查询结果。以后的查询则直接使用查询集的缓存。

字段的查询(即方法filter(),exclude(),get()的参数)

概述:实现了SQL语句中的where 语句,

字段查询,即是以上方法的参数

语法:

属性名称__比较运算符=值    注意:是双下划线

外键查询的语法:

属性名_id   注意:是单下划线

转义:

类似于SQL语句中的like语句。即模糊查询

比较运算符查询

exact  用于判断,大小写敏感  例:filter(isDelete=False)

contains 就否包含,相当于SQLlike,大小写敏感

startswith,  endswith  value开头或者结尾,大小写敏感,

说明:

以上4个在前面加上i就表示不区分大小写

isnull  isnotnull    是否为空  例:filter(sname__isnull=False)  #名字不为空的

in 是否在范围内  例:filter(pk_in=[2,4,6,8,10])

gt    大于

gte  大于等于

lt   小于

lte 小于等于

例如:

转义

contaions 不需转义,“= ” 号后面是什么符号就匹配什么符号

SQL中的like(‘%’)  如果要匹配%这样的特殊字符,就必须转义

跨关联查询

处理join查询

语法:

模型类名__属性名__比较运算符  (比较运算符是可以没有的)

注意:

因为要获取的是班级信息,所以写法是 Grades.objects.filter(xxxx)

然后是外关联条件 

查询快捷

pk  代表主键,

聚合函数(最大值,最小值。。)

使用aggregate()函数返回聚合函数的值

Avg

Count

Max

Min

Sum

例:以最大值为例Max()

F对象

1,可以使用模型的A属性和B属进行比较 (一条数据里的两个字段比较)

2,支持F对象的算术运算(也可以时间加减。。)

Q对象

需求:进行or查询 (解决或的查询,  非的查询)

说明:

当时有一个Q时,有没有Q效果是一样的,

例如 studentslist=Students.stuObj.filter(Q(pk__lt=3) )

可以取反,如下截图:

   

日期查询

year

month

day

week_day

hour

minute

second

原文地址:https://www.cnblogs.com/2mei/p/9203386.html