• 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

  • 相关阅读:
    顶级Kagglers的心得和技巧
    大数加法
    TensorFlow 2.0高效开发指南
    Java 8 特性 —— Stream
    Java 8 特性 —— 函数式接口
    Java 8 特性 —— 方法引用
    Java 8 特性 —— 默认方法和静态方法
    Java 8 特性 —— lambda 表达式
    Effective Java 读书笔记
    jQuery动态添加、删除按钮及input输入框
  • 原文地址:https://www.cnblogs.com/2mei/p/9203386.html
Copyright © 2020-2023  润新知