Django_模型

5 篇文章 0 订阅
1 篇文章 0 订阅

ORM

  • ORM全拼 Object-Relation Mapping, 对象-关系映射,主要实现模型对象到关系数据库数据的映射()
ORM图解
# 调用模型类对象的Save()生成 insertupdate语句
# 调用模型类对象的Delete()生成delete语句
# 调用模型类的all()、get()生成select语句 
#优点 
* 只需要面向对象编程,不需要面向数据库编写代码
            - 对数据库的操作都转化成类属性和方法的操作
            - 不用编写各种数据库的sql语句
* 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异
        - 不在关注用的是myspl、oracle...等
        - 通过简单的配置就可以轻松更换数据库,而不需要修该代码
# 缺点
* 相比较直接使用SQL语句操作数据库,有性能损失
* 根据对象的操作转换成SQL语句,根据查询的结果转化成对象,在映射过程中有性能损失
* 都不写SQL语句了

mysql数据库配置

pip install pymysql

# 配置mysql数据库
DATABASES={
        # 可配置多个(主从关系)
        'default':{
               'ENGINE': 'django.db.backends.mysql',   # 数据库引擎
               'NAME': 'Bookdb',   # 数据库名称
               'HOST': '192.168.80.132',  # 数据库主机
               'PORT': '3306',  # 数据库端口
               'USER': 'root',  # 数据库用户名
               'PASSWORD': 'mysql', # 数据库密码
    }
}
# 退出数据库操作
control+d

字段类型

  • 总结语法:属性名 = modles.字段类型(选项)
    - 定义属性时需要指定字段类型,通过字段类型的参数指定选项
# 属性名
- 不允许使用python的保留关键字
- 不允许使用mysql的保留关键字
- 不允许使用连续的下划线,因为Django的查询语法就是连续的下划线
# 字段类型
##提示:Django根据属性的类型确定以下信息
- 当前选择的数据库支持字段的类型
- 渲染管理表单时使用的默认html控件
- 在管理站点最低限度的验证
- 使用时需要引入from django.db import models包

AutoField:自动增长的IntegerField,通常不用指定
BooleanField:布尔字段,值为TrueFalse
NullBooleanField:支持Null、TrueFalse三种值
CharField(max_length=字符长度): 字符串
TextFiled:大文本字段,一般超过4000个字符时使用
IntegeField: 整数
                 # 表示总位数 , 表示小数位数
DecimalField(max_digits=None,decimal_places=None):可以指定精度的十进制浮点数
FloatField: 浮点数
            #最后一次修改的时间,创建的时间
DateField[auto_now=False,auto_now_add=False]:日期
TimeField:时间,参数同DateField
DateTimeField:日期时间,参数同DateField
FileField:上传文件字段
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片

# 选项:通过选项实现对字段的约束

null:如果为True,表示允许为空,默认值是False(针对数据库表里的字段的约束)
blank:如果为True,则该字段允许为空白,默认值是False(针对后台站点的表单的约束)
db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False
default:默认值
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False
# 关系字段类型(三种类型)
ForeignKey:一对多,将字段定义在多的一端中
ManyToManField:多对多,将字段定义在任意一端中
OneToOneField:一对一,将字段定义在任意一端中
维护递归的关联关系,使用self指定
# 元选项
- 作用:修改数据库表的默认的名称
- 修改、创建表就要迁移
class Meta: #元信息类
          db_table = 'bookinfo' #自定义表的名字

模型成员

# 模型实例方法
str:在将对象转换成字符串时会被调用
save:将模型对象保存到数据库表中
delete:将模型对象从数据库表中删除

# objects模型属性
- objects: 管理器对象
        -Manager类型的对象
        - 用于模型对象和数据库交互
        - 默认自动生成的属性,但是可以自定义管理器对象
- 自定义管理器对象后,Django不再可以自定义管理器对象objects

# 管理器类Manager
- 定义在from django.db import models中
- 管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器
- Django模型支持自定义管理器类,继承自models.Manager
## 自定义管理器主要2中情况
1.修改原始查询集,重写get_queryset()方法
        - 查询时,如果需要默认过虑掉某些数据,需要修改原始查询集
2.新增管理器方法,如创建模型对象方法.
        - 当模型属性很多,多数字段默认值,每次只需要给少数属性赋值时,可以新增模型初始化方法
* 注意:不能重写init方法做初始化操作;因为Model本身会在init方法中做默认的初始化操作,如果重写该方法会跟Model默认的冲突

查询操作

  • 查询集:表示从数据库中获取的模型对象集合
# 特点
1.惰性执行:创建查询集不会访问数据库,直到在模板中调用数据时,才会访问数据库
        - 调用数据的情况包括迭代、序列化、与if合用
2.缓存:查询集的结果被存下来之后,再次查询相同数据时会使用之前缓存的数据
  • 过滤器:基于所给的参数限制查询的结果
# 返回列表的过滤器
all():返回所有的数据
filter():返回满足条件的数据
exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
order_by:返回排序后的数据
# 返回单个对象的过滤器
get():返回单个满足条件的对象
count():返回当前查询的总条数
aggregate():聚合
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False
  • 限制查询集
    • 查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和offset子句
    • 注意:不支持负数索引
    • 使用下标后返回一个新的查询集,不会立即执行查询

基础条件查询

  • 语法:filter(模型属性__条件运算符=值)
  • 提示:exact(判断相等可以不写直接id=1,id等价于PK)、contains(表示包含,类似like)、starswith(以什么开头)、endswith(以什么结尾)、isnull(是否为空)、in(表示只能在指定的选项中,不表示区间)、gt:大于lt:小于gte:大于等于 lte:小于等于,运算符都区分大小写,在其前加i表示不区分大小写

F和Q对象

# F对象语法
from django.db.models import F
F('属性名')

# Q对象语法
from django.db.models import Q
# 逻辑或
Q(模型属性1_条件运算符=值) | Q(模型属性2_条件运算符=值)
# 逻辑非
~Q(模型属性_条件运算符=值)

聚合函数

  • 使用aggregate()过滤器调用聚合函数,返回单个对象

# 聚合函数包括:Avg, Max, Min, Sum, Count(使用Count一般直接调用)

关联查询

# 基础关联查询
 - 一查多:会把多的那个模型类名全部转成小写,再拼接_set
# 内连接查询语法
filter(关联模型类名小写_属性名_运算符=值)
 - 多查一,关联的模型类名小写需要使用外键

# 自关联查询
自关联的表结构:对于地区信息、分类信息等数据,表结构非常类似,每个表的数据量十分有限,为了充分利用数据表的大量数据存储功能,可以可以设计成一张表,内部的关系字段指向本表的主键
说明:关系属性使用self指向本类,要求null和blank允许为空,因为一级数据是没有父级的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值