Django之Model类
1、model
用来和数据交互的(读取和传入数据)
2、orm
Object Relational Mapping对象关系映射,python中的model对象和数据库中的表做映射
3、重要概念
3.1、类-表对应
model中的一个类对应数据库中的一个表。实现方式:继承Model类(django.db.models.Model)
3.2、属性-字段
类中的属性对应数据库中的字段
3.2.1、类型
CharField 字符类型
IntegerField 数值类型,choise枚举类型数据,元祖包元祖
type = models.IntegerField(choices=((1,‘机构‘),(2,‘课程‘),(3,‘讲师‘)),verbose_name="类别")
BooleanField 布尔类型
NullBooleanField 可以为空的布尔值
AutoField int自增列,必须填入参数 primary_key=True,auto_create,自动创建,mysql的auto_increment
FloatField 浮点型
DecimalField 同Python的Decimal类型,参数:max_digits 最大总位数,decimal_places 小数点后的位数
TextField 文本类型
UUIDField 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
# 模型类 class Order(models.Model): no = models.UUIDField(verbose_name=‘订单编号‘) price = models.DecimalField(verbose_name=‘订单金额‘,max_digits=6, decimal_places=2) pay_state = models.BooleanField(default=False) # 创建对象 import uuid Order.objects.create(no=uuid.uuid4(),price=1819.567,pay_state=True) # price只保留两位小数,会自动四舍五入
FileField 文件,字符串,路径会保存到数据库,文件上传到指定目录
参数:upload_to = "" 上传文件的保存路径,storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
ImageField 图片,路径保存到数据库,文件上传到指定目录
参数:upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None, 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串)
DateField 日期类型,格式:格式:YYYY-MM-DD
参数:auto_now 每次保存时,自动设置当前字段为当前时间,用于最后一次修改
auto_now_add 每一次保存时,自动设置为当前时间,用于“创建时间”
注意:auto_now和auto_now_add及default只能设置一个,不能组合
DateTimeField 日期时间类型 datetime.datetime,日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
TimeField 时间类型, 格式: HH:MM[:ss[.uuuuuu]]
3.2.2、约束
max_length 最大长度
default 默认值
unique 唯一值
primary_key 主键
null
blank 是否允许输入为空,即输入空字符串
db_index 索引
db_column 指定字段名
verbose_name 在admin显示字段名称
choices 一个包含多元素元组的可迭代的对象,用于给字段提供选项
3.2.3、关系
ForeignKey 一对多,将字段定义在多端,自动在多端中添加一个外键,如:store = ForeginKey(Store, db_column="外键的列名"),外键字段: store_id
OneToOneField 一对一,将字段定义在任意一端
ManyToManyField 多对多,将字段定义在两端
4、元信息
在Model的子类中定义Meta来声明表的相关信息
# 需要定义在类的内部 class Meta: app_label=‘‘ # 应用名 db_table=‘‘ # 表名 ordering = [] # 排序字段,字段名前可使用‘-‘表示倒序 verbose_name = ‘‘ # admin中所显示的名称 unique_together= ‘‘ # 来设置的不重复的字段组合
5、CRUD
5.1、增
5.1.1、通过模型类对象管理器插入记录
语法:模型类名.objects.create(类属性=值) 此方式是直接操作数据库
stu1 = Student.objects.create(name=‘Negan‘,sex=‘m‘,score=95.0)
5.1.2、实例化模型对象插入数据
car = Car(name="宝马3",price=20.5) car.save()
car = Car() car.name="宝马5i" car.price=50.5 car.save()
通过对象模型进行插入操作是在内存中执行的,也就是说在没有save()之前都是在内存中操作,和数据库没有关系,只有在save()后,才将数据加载到数据库
5.2、查
5.2.1过滤器
filter 选出符合条件的数据,可以包含多个字段,用“,”隔开表示与的关系
s1 = Student.objects.filter(sex=‘m‘,name=‘Neagn‘) # 支持链式调用 s1 = Student.objects.filter(sex=‘m‘).filter(name=‘Negan‘)
exclude 去掉符合条件的
s1 = Student.objects.filter(sex=‘m‘).exclude(socre=72) # 找出性别为m以及分数不是72的
5.2.2条件
语法:属性名__运算符=临界值
gt 大于
Car.objects.filter(price__gt=30)
lt 小于
gte 大于等于
lte 小于等于
exact 精确内容查找,区分大小写
iexact i 代表ignore(忽略),即忽略大小写
contains 内容包含,相当于模糊查询
Car.objects.filter(name__contains=‘奔‘)
startswith 以...开头
endswith 以..结尾
istartswith 以...开头,忽略大小写
endswith 以..结尾,忽略大小写
icontains 包含xx字符,忽略大小写
in 包含值项
Car.objects.filter(price__in=(30.58,26.65))
isnull 为null
isnotnull 非null