• django模型详解(四)


    1 概述

    (1)概述 : Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,根据不同的业务需求选择不同的数据库
    (2)定义模型
    模型,属性,表,字段间的关系
    	一个模型类对应数据库的一张表,在模型类中定义属性,对应模型对照表的字段配置数据库
    (3)django开发流程:
    1 配置数据库
    2 定义模型类 : 一个模型类一张数据表
    3 生成迁移文件 : 注意模型不能为空
    4 执行迁移文件生成数据表
    5 使用模型类进行增删改查
    

    2 ORM

    (1)ORM概述 :o--对象  R--关系  M--映射
    	作用 :Django  --- ORM模型(对象映射关系)生成执行语句 ---   调用mysql ,split.oracle 
    (2)ORM执行处理操作    
    	根据对象的类型生成数据表结构
    	将对象,列表的操作转换为sql语句
    	将sql语句查询到的结果转为对象或列表
    (3)优点
    	极大减轻开发人员的工作量,不需要面对因数据库的变更而修改代码
    

    3 定义属性

    #(1)概述
    	django根据属性类型确定
    		当前数据库支持的字段类型
    		渲染管理表单时使用的默认html控件
    		在管理站点最低限度的验证
    	django表为表增加自动增长的主键列,每个模型对应一个主键列
    	属性命名
    		不能是python保留关键字
    		不允许使用连续下划线
    #(2)库继承db.models
    	定义属性需要字段类型,定义在django.db.models.field目录下,为方便使用被导入到django.db.models中
    	使用方式:
    	from django.db import models
    	通过models.Field创建的字段类型的对象,赋值给属性
    #(3)逻辑删除
    	对于重要数据都做逻辑删除,不做物理删除
    	实现方法:定义isDelete属性,类型为BooleanField,默认为false
    #(4)字段类型
    	AutoField   自动设置主键,主键字段会添加到表
    	CharField(max_length=字符长度)   字符串,默认表单样式为TextInput
    	TextField 大文本字段,一般超过4000使用,默认表单为Textarea
    	IntgerField  整数
    	DecimalField(max_digits=None,decimal_places=None)   十进制浮点数,小数
    	max_digits 位数总数
    	decimal_places   小数点后的位数
    	FloatField  用python的float实例表示浮点数
    	BlooeanField  布尔型  True/Flase 字段   此字段默认表单是CheckboxInput
    	NullBooleanField  支持True false null三种字段
    	DateField   日期  使用Python中的dateTime.date
    	TimeFiled   时间
    	DateTimeField  日期+时间
    	FileField  上传文字的字段
    	ImageField 继承FileFiled的所有属性与方法,但对上传对象进行校检
    #(5)字段选项
    	概述 : 通过字段选项可以实现对字段的约束
    		  通过字段对象时通过关键字运行参数指定
    	null    Django将空值以null形式存储到数据库,默认false
    	blanke     如果为True,字段允许空白,表单验证范畴
    	db_column  字段名称,未指定使用属性名称
    	db.index  值为true,则在表中为此字段创建索引
    	default   默认值
    	primary_key  若为true ,则字段成为模型主键字段
    	unique    如果为True  字段在表中必须有唯一值
    #(6)关系
    	分类
    		ForeignKey   一对多,将字段定义在多的类中
    		ManyToManyField  多对多,将字段定义在两端中
    		OneToOneField  一对多,将字段定义在任意一端
    
    #(7)一对多正反向查询
    一对多访问:
    对象.模板类小写_set
    grade.students_set.属性
    多访问一:
    对象.模板类小写.属性
    Students.objects.get(pk=2).grades.gname
    
    #(8)一对一正反向查询
    用一对一访问:
    对象.被关联class小写
    grade.students.sname
    一对一反向查询:
    对象名.关联对象类名小写.属性
    students.grades.gname
    
    #(9)多对多正反向查询
    多对多访问:
    对象.关联字段
    多对多反向查询:
    对象.被关联对象class小写_set			
    

    4 创建模型类: 元选项

    在模型类红定义的一个Meta类,用于设置原信息
    db_table
    	定义数据表名,推荐使用小写字母,不写数据表明默认:项目名小写_类名小写
    	class Meta:
    	db_table = 'student'
    	ordering = ['id']    在模型类中定义子类
    ordering
    	对象默认的排序字段,获取对象的列表时使用
    	ordering[id]
    		升序
    	ordering[-id]
    		降序
    

    5 类属性

    (1)隐藏类属性objects
    	objects 是Manager类型的一个对象,主要是实现与数据库的交互
    	当定义模型类时,没有指定管理器,则Django为模型创建一个objects管理器
    (2)自定义管理器
    	自定义模型管理器 : 
    class Student(models.Model)
    	stuObj = models.Manager()
    	默认模型管理器objects就不适用: student.object.Manager
    (3)自定义管理器Manager类
    	模型管理器django模型进行与数据库进行交互的接口,一个模型类可以定义多个模型管理器
    	作用
    		向管理器类中添加额外的方法
    		修改管理器返回的原始集合(查询集) : 通过重写方法get_queryset()方法
    	代码
    class StudentsManager(models.Manager):   #自定义StudentManager类
    	def  get_queryset(self):	#重写获取对象集方法
    		#返回父类原始集筛选后的查询集
    		return super(StudentManager,self).filter(isDelete = False)   
    
    class StudentManage(models.Model)
    	#重新生成的stuObj对象
        stuObj2 = StudentManager()
    
    

    6 创建对象

    创建对象
    目的 : 向数据库中添加数据
    当创建对象时,django不会对数据库进行读写操作,当调用save()方法时,才开始进行交互,将对象保存到数据库表中
    注意: __init__方法已经在父类models.Model中使用,在自定义的模型中无法使用
    	方法
    		在模型类中增加一个类方法用以创建对象
    #model.py中创建类方法
    class Student(modelsModel):
    	@classmethod    #装饰器中引入cls方法
    	def createStudent(cls,name,age,gender,grade)
    	        stu = cls(sname=name,sage=age,sgender=gender,sgrade=grade)
    	        return stu
    
    #view.py 中创建添加学生函数
    def addstudent(request):
    	grade = Grades.objects.get(pk=1)
    	stu = Student.createStudent('tom',20,True,grade)
    	stu.save()
    	return HttpResponse('创建成功')
    url.py中采用正则匹配
    urlpatterns = [
    	url(r''^addstudent/$'',views.addstudent)   #匹配到view中对应的addstudent方法
    ]
    
    #在自定义管理器添加方法
    在models.py中类StudentManager类中定义方法
    class  StudentManager(models.Manager):
    	def get_queryset(self):
    		return super(StudentManager,self).get_queryset().filter(isDelete=True)
    	def createStudent(self,name,age,gender):
    		stu = self.model()
    		stu.sname = name
    		stu.sage = age
    		stu.sgender=gender
    #在view.py视图中添加方法:
    def student2(request):
    	grade = Grades.objects.get(pk=1)
    	stu = Student.stuObj2.createStudent('andy',34,True)
    	stu.save()
    	return HttpResponse('创建成功')
    #在urls.py路由中添加正则:
    	url(r'^addstudent2/$',views.addstudent)
    

    7 模型查询

    概述
    	1 查询集:表示从数据库中获取的对象的集合
    	2查询集可以有多个过滤器
    	3过滤器就是一个函数,基于所给的参数限制查询的结果,类似where语句
    	4 查询集等同select语句
    
    1 在管理器上调用过滤器方法查询
    2 查询集经过过滤器筛选后返回新的查询集,可以链式调用
    3 惰性执行
    	创建查询集不会带来任何数据库的访问直到调用数据库才会访问
    #4 直接访问数据
    	迭代
    	序列化
    	与if合用
    #5 返回查询集的方法称为过滤器
    	all()
    		返回所有对象
    	filter()
    		filter(键=值,键=值)  且关系
    		返回符合条件的数据
    		filter(键=值),filter(键=值)
    	exclude()
    		过滤掉符合条件数据
    	order_by()
    		排序
    	values()
    		一条数据就是是一个对象(字典),返回一个列表
    #6 返回单个数据
    	get()
    		返回一个满足条件的对象
    		注意:没有找到符合条件的对象,模型类引发异常  模型类.DoesNotExists异常
    		如果找到多个对象也会引发异常   模型类.MultipleObjectsReturned
    	count()
    		返回查询集中的对象个数
    	first()
    		返回第一个查询集对象
    	last()
    		返回最后一个查询集对象
    	exists()
    		查询集是否有数据,如果有数据返回true
    #7 限制查询集
    	查询集返回的是列表,可以采用下标的方法进行限制,等同于sql中的limit语句
    	注意下标不能为负
    	studentList = Student.objects.all()[0:5]
    #8 查询集的缓存
    概述 :每个查询集都包含一个缓存,来最小化的对数据库访问,在新建的查询集中,缓存首次为空,第一次对查询集求值,django会将数据缓存,并返回结果,以后结果直接使用缓存集的数据
    
    

    8 字段查询

    #(1)概述
    	实现where语句,作为filter()  exclude()  get()的参数
    	语法
    		属性名称__运算符 = 值
    	外键
    		属性名_id
    	转义
    		类似like语句,是为了匹配占位,匹配数据中的%,sql中where like '\%'
    		filter(sname__contains = '%')
            
    #(2)比较运算符
    	exact
    		判断,大小写敏感
    		filter(isDelete=False)
    	contains
    		是否包含,大小写敏感
    		stuList = Student.objects.filter(sname__contains ='孙' )
    	startswith
    		以value开头,大小写敏感
    		stuList = Student.objects.filter(sname__startswith ='孙' )
    	endwith
    		以value结尾,大小写敏感
    	isnull  ,isnotnull   是否为空
    		filter(sname__isnull=Flase)
    	in
    		是否包含在范围内
    		filter(pk__in=[2,4,6,8,10])
    #(3)运算符
    gt  大于
    gte  大于等于
    lt   小于
    lte	 小于等于
    filter(sage_gt=30)年龄大于30
    
    year  month day  week_day  hour  minute  second
    filter(lastTime__year=2017)
    
    跨关查询 : 处理join查询  模型类型__属性名__运算符(可选)
    查询快捷 : pk 代表的主键
    iexact,icontains,istartswith,iendswith
    以上四个前面加上i,就表示不区分大小写
    

    9 聚合函数

    #(1)使用aggregate()函数返回聚合函数的值
    Avg   Count  Max  Min  sum
    from dango.db.models import Max
    maxAge = Student.objects.aggregate(Max('sage'))   找出学生年龄最大的
    #(2)F对象
    	1 可以使用模型的A属性与B属性进行比较
    	from django.db.models  import F,Q
    	def grades(request):
    		g = Grades.objects.filter(ggirlnum_gt=F('gboynum'))   找到女生人输大于男生人数的班级
    	2 支持F对象的算术运算  filter(ggirlnum_gt=F('gboynum')+20)
    	3 F对象的参数可以是跨表字段
    		models.Book.objects.filter(bread_num=F(''author_name'))
    	4 F对象参数如果是date/time,可以进行日期的加减运算:
    		models.Book.objects.filter(bpub_date__lt=F('bpub_date') + timedelta(days=5))
    #(3)Q对象
    	概述 :过滤器的方法中的关键字参数,,条件为And模式,采用逻辑或引入Q对象
    	需求 : 进行or查询
    	解决 : 使用Q对象
    	Q对象可以使用&(and)、|(or)操作符组合起来
    		studentList = Student.objects.filter(Q(pk__lt = 3)|Q(sage__gt=50))  
    		models.User.objects.filter(Q(username='老王') & Q(userpass='admin'))   条件与组合
    		models.User.objects.filter(~Q(username='老王'))   条件非表示取反
    	可以使用&|~结合括号进行分组,构造更复杂的Q对象
    		filter函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and
    		studentList = Student.objects.filter(Q(pk__lt = 3)   只有 一个Q对象就是单纯匹配
    		studentList = Student.objects.filter(~Q(pk__lt = 3)    表示对Q对象取反
    
  • 相关阅读:
    Hadoop week review
    [Q&A] VS 连接 SQLServer 时未找到或无法访问服务器
    [System] CentOS虚拟机系统克隆后的网络配置
    [Tool] csdn客户端开发(非官方版)
    [MySQL] Win7 下修改 MySQL 5.5 默认编码格式
    [Q&A] MySQL Error 1050(42S01): Table already exist
    [Matlab] libsvmmat 安装
    [SL] Silverlight + WCF Demo项目
    [Q&A] 在证书存储区中找不到清单签名证书
    谷歌浏览器当手机浏览器
  • 原文地址:https://www.cnblogs.com/why957/p/9192986.html
Copyright © 2020-2023  润新知