Django-Models
02day Django里面的模型
model
在企业开发中通常都是从数据开始开发的
ORM:
对象关系映射
可以理解为翻译机
核心思想 解耦合
将业务逻辑和SQL进行了一种转换
例如 model里面的 save = insert query = select。ORM:翻译成不同的mysql语言,面向基础编程。
django定义模型:
重要概念:模型---》表,属性---》字段(三大种,字符串,数字,时间),注意不允许使用连续的下划线
定义属性见定义属性文件
创建模型类
元选项,在模型类中定义Meta,用于设置元信息
class Meta:
db_table = xxx 定义数据表名,推荐使用小写字母
ordering =[]
对象的默认排序字段,获取对象列表时使用,通常是Integer类型。升序oredering['id'],降序ordering['-id']
字段类型:
AutoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,将一个主键字段自动添加到模型中
CharField(max_length=字段长度):字符串,默认的表单样式是:TextInput
TextField:大文本字段,一般超过4k字段时候使用,还有那种商品字段
integerfield:整数
DecimaField(max_digits=None,decimal_place=None):其实和integerfield差不多,但是它的精度更加高一些
max_digits=总位数
decimal_place=None=小数点后的数字位数
Floatfield:浮点型
BooleanField:布尔型的字段,默认的表单是checkboxinput
NullBooleanField:支持布尔型加个null
Datafield日期
timefield时间
datatimefield时间日期
FileField:一个上传文件的字段(存的是文件的路径)
imageField:继承了FileField的所有属性和方法,但对上传的对象进行效验,确保它是一个有效的image
自定义
生成的mysql语言:
模型成员objects
Django默认通过模型的objects对象实现模型数据实现
Django中有两个常用用于筛选记录
filter:返回符合筛选条件的数据集
exclude:返回不符合筛选条件的数据集
多个filter和exclude可以连接在一起使用
链式使用:preson.object.filter()filter().exclude().exclude().......
创建对象的方法有很多种:
1.def get_presons(request):
preons = Preson.objects.create(p_age=)
2.def get_presons(request):
preons = Preson(p_name=xxx) 但是这种存的时候为空,是blanck形的,不能重写__init__,但是可以通过其他方法实现属性自定义赋值
3.def add_preson(request):
for i in range(15):
person = Preson()
flag = random.randrange(100)
person.p_name = 'tom%d' %i
person.p_age = flag
person.p_sex = flag % 2
person.save()
return HttpResponse('批量创建成功')
使用其他方法给属性自定义赋值:
1.对象方法:可以调用对象的属性也可以调用类的属性
2.类方法:不能调用对象属性,只能调用类属性
3.静态方法:啥都不能调用的方法,不能获取对象属性也不能获取类属性,只是寄生在类上而已
@classmethod
def create(cls,p_name,p_age=18,p_sex = False):
return cls(p_name,p_age=p_age,p_sex=p_sex)
查询集和过滤器:
在管理器上调用方法返回查询集
查询经过过滤器筛选后返回的新的查询集,所以可以写成链式调用
返回集合的方法称为过滤器:
all()返回所有数据
filter()返回符合条件的数据
exclude()过滤掉符合条件的数据
order by()排序
values()一条数据就是一个字典,返回一个列表
例如在views中查找:
def get_preson(request):
presons = Preson.objects.filter(p_age__gt=18)
context = {
'presons':presons
}
return render(request,'presonslist.html',context=context)
返回单个数据
get()返回一个满足条件的对象
如果没有找到满足条件的对象会引发模型类.DoseNotExits异常
如果找到多个,会引发模型类.MultiObjectReturned异常
first():返回查询集中的第一个对象
last();返回最后一个对象
count():返回当前查询中对象的个数
exists():判断查询集中是否有数据,如果有返回一个True
状态码:
2xx:请求是成功的
3xx:转发,重定向
4xx:客户端错误
5xx:服务器错误
限制查询集和查询集的缓存:
可以使用下标的方法进行限制:等同于sql中的limit
xxx = XXX.objects.all()[0:5] 注意下表不能是负数
查询集缓存:每一个查询集都包含一个缓存,来最小化对数据库的访问
在新建的查询集中缓存初始为0,第一次查询会发生数据缓存,django会将查询出来的数据做一个缓存,并返回查询结构,以后的查询结果直接使用查询集的缓存
字段查询
对sql中where的实现,作为方法filter(),exclude(),get()的参数
语法:属性名称_比较运算符=值
外键:属性名_id
转义:like语句中使用%是为了匹配占位,匹配数据中的%(where like '\%') filter(sname_contains='%')
比较运算符:gt lt gte lte in(在某一集合中) contains(模糊查询) startswith(以...开始) endswith(以....结束)
级联数据,s_grade = models.Model.ForeignKey(别的表中的属性)
F对象:
可以使用模型的A属性与B属性进行对比
grades = Grade.objects.filter(ggirlnum_gt=F('gboynum'))
grades = Grade.objects.filter(ggirlnum_gt=F('gboynum')+10)
可以获取我们属性的值
可以实现一个模型的不同属性的运算操作
还可以支持算数运算
Q对象:
过滤器的方法中的关键参数,常用于组合条件
年龄小于25:student.objects.filter(Q(sage__lt=25))
Q对象语法支持 l or & and ~ 取反
年龄大于等于25: student.objects.filter(Q(sage__lt =25))
可以对条件进行封装
封装之后,可以支持逻辑运算
模型成员:这是django特有的一个
类属性
显性:自己写的那些
硬性:objects是一个manager类型的对象。作用于数据库的交互
当模型类没有指定管理器的时候,djang会自动为我们生成一个模型管理器
当然我们可以自己定义一个自定义管理器
class student (models.Model):
stuManager = models.Manager()
当自定义模型管理器的时候,objects就不存在了,django就不会为我们自动创建模型生成器
smartcat.994