本文共 7107 字,大约阅读时间需要 23 分钟。
(1)概述 : Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,根据不同的业务需求选择不同的数据库(2)定义模型模型,属性,表,字段间的关系 一个模型类对应数据库的一张表,在模型类中定义属性,对应模型对照表的字段配置数据库(3)django开发流程:1 配置数据库2 定义模型类 : 一个模型类一张数据表3 生成迁移文件 : 注意模型不能为空4 执行迁移文件生成数据表5 使用模型类进行增删改查
(1)ORM概述 :o--对象 R--关系 M--映射 作用 :Django --- ORM模型(对象映射关系)生成执行语句 --- 调用mysql ,split.oracle (2)ORM执行处理操作 根据对象的类型生成数据表结构 将对象,列表的操作转换为sql语句 将sql语句查询到的结果转为对象或列表(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)一对多正反向查询一对多访问:对象.模板类小写_setgrade.students_set.属性多访问一:对象.模板类小写.属性Students.objects.get(pk=2).grades.gname#(8)一对一正反向查询用一对一访问:对象.被关联class小写grade.students.sname一对一反向查询:对象名.关联对象类名小写.属性students.grades.gname#(9)多对多正反向查询多对多访问:对象.关联字段多对多反向查询:对象.被关联对象class小写_set
在模型类红定义的一个Meta类,用于设置原信息db_table 定义数据表名,推荐使用小写字母,不写数据表明默认:项目名小写_类名小写 class Meta: db_table = 'student' ordering = ['id'] 在模型类中定义子类ordering 对象默认的排序字段,获取对象的列表时使用 ordering[id] 升序 ordering[-id] 降序
(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()
创建对象目的 : 向数据库中添加数据当创建对象时,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)
概述 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会将数据缓存,并返回结果,以后结果直接使用缓存集的数据
#(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)年龄大于30year month day week_day hour minute secondfilter(lastTime__year=2017)跨关查询 : 处理join查询 模型类型__属性名__运算符(可选)查询快捷 : pk 代表的主键iexact,icontains,istartswith,iendswith以上四个前面加上i,就表示不区分大小写
#(1)使用aggregate()函数返回聚合函数的值Avg Count Max Min sumfrom dango.db.models import MaxmaxAge = 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对象取反
转载地址:http://bqhym.baihongyu.com/