Django进阶
Posted sutcoderhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django进阶相关的知识,希望对你有一定的参考价值。
一、models(模块)的知识展开
- ORM(管理器)的概念,ORM指的是对象-关系-映射的简称,是把数据库表映射成为一个类,类属性表示字段,这样做的好处是对于开发者而言更加
的可操作化,在对数据库进行增删改查可直接对对象进行操作而不用考虑具体SQl语句。而内部实现交互是管理器自动完成的,在定义类的时候一定要继承models模块中的Model类,使该类为模型类。目前models支持sqlite、mysql、oracle三种主流数据库。但这样做也有一定
的缺点那就是内部转化的过程中可能会花费一些时间,使得效率不是那么高。 - 使用Models之前第一步先去到配置文件中更改database为要使用的数据库,同时把目前的应用加入配置文件中installed_app项。当定义完字段类型及属性之后makemigrations生成迁移文件,是内部转换sql语句,最后在migrate执行迁移文件,将数据导入。
- 多张表的关系类型分为
一对多:ForeignKey—— 将字段定义在多的一端
多对多:ManyToManyField —-将字段定义在两端
一对一:OneToOneField—— 将字段定义任意一段 - 具体处理一对多的关系(以英雄图书为例)由于将字段定义在了多的一端,所以当使用多的一端查询时可以直接使用hero.book_id 多少一端由于没有字段,所以应使用 book.heroinfo_set 获取该图书中的所有英雄
- 在定义字段时tittle= models.CharField()括号里面写的是字段选项,如max_length=20就是最大长度为20以及如default设置默认值,null等多种字段选项,用来装饰限制该字段
- 元选项Meta类,该类是定义在模型类里面的,在python中称为元类。而该类在此处的作用是设置元信息, 如可以更改表的名字db_table=‘book’以及排序等等,表名默认为 应用名_模型类
- 在一个项目中创建多个应用的好处是增加代码的重用性
- 再去增删改一个表时,可以利用该表生成一个对象,利用对象对该表中的信息进行操作,最后调用save()方法进行保存
- 模型中的管理器
- 管理器是模型类中的一个属性,用来对模型类和数据表之间进行映射,默认使用的是object管理器。
- 而这种管理器也可以被我们自己定义,通过自己定义一个类,然后继承models模块里的Manager,通过重写或新定义里面的方法也能实现管理器功能。
- 而在Django我们也可以使用多个管理器,在使用时直接用模型类引用管理中方法即可,用到哪个管理器引用哪个。
- 重新定义管理器有两个好处
第一,可以对查询之后的结果进行筛选使其返回不同的结果集
第二,可以更方便的创建模型对象,这种方法可以用来取代在模型类本身中定义create类方法(因为模型类中不能定义__init__对象方法)。在管理器
中定义creat方法,之后用到的话直接通过对象调用即可。
- 有关查询
- 再使用模型类的过程中,一定会涉及到查询表中的数据并传到前台进行显示。而其实现途径和写SQL查询语句本质上没有什么区别的。
都是返回一个查询集,而返回查询集之前我们仍然可以对其进行筛选、聚合等一系列SQL操作。 - 返回查询集的方法称为过滤器,具体有all()、filter()、exclude()、order_by()、values()等多种方法
其中最长用的是all(通通返回)、filter()对返回之前进行过滤 - 使用filter过程中会用到比较、包含等多种运算关系,具体都是在filter(这里写),其中实现两个不同字段的比较要引入F对象
- 管理器也可以直接使用聚合aggregate(Max等方法)进行直接查询返回结果
- filter()中的条件与关系用filter(条件1).filter(条件2)来实现,或者filter(条件1,条件2)
而或的关系要引入Q对象,通过Q(条件1)|Q(条件2)来实现
- 再使用模型类的过程中,一定会涉及到查询表中的数据并传到前台进行显示。而其实现途径和写SQL查询语句本质上没有什么区别的。
以上是关于Django进阶的主要内容,如果未能解决你的问题,请参考以下文章