Django中的ORM模型

一、Djang的ORM框架

(一)ORM

1、O(objects):类和对象。

2、R(Relation):关系,关系数据库中的表格。

3、M(Mapping):映射。

(二)ORM框架功能

1、建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。

2、根据设计的模型类生成数据库中的表格。

3、通过配置就可以进行数据库的切换

 

二、Django的数据库

(一)mysql数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'mysql',  # 数据库用户密码
        'NAME': 'django_demo'  # 数据库名字
    }
}

 

注意:Django不会给我们创建mysql数据库,这个数据库我们得先创建好。(注意指定charset=utf-8)

(二)切换数据库后不能启动服务器问题

1、需要安装mysql的包,

2、python2中:在虚拟环境下,pip install mysql-python

3、python3中,在虚拟环境下:pip install pymysql

注意:需要在项目的__init__.py中添加如下内容:

1⃣import pymysql

2⃣pymysql.install_as_MySQLdb()

 

三、重定向

(一)重定向定义

 

页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url地址

(二)重定向例子

from django.shortcuts import render,redirect

from django.http import HttpResponseRedirect

def create(request):

b = BookInfo()

b.btitle = "流星蝴蝶剑"

b.bpub_date = date(1991,1,1)

b.save()

return HttpResponseRedirect("/") # 重定向

def delete(request, id):

book = BookInfo.objects.get(id=id)

book.delete()

return redirect('/') # 重定向

 

三、字段属性和选项

(一)模型类属性命名规则

1、不能用python保留字。

2、不允许使用连续的下划线,这是由django的查询方式决定的

3、定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:属性名=models.字段类型(选项)

(二)字段类型

使用时需要引入:from django.db import models

类型

描述

AutoField

自动增长,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。

BooleanField

布尔字段,值为True或False。

NullBooleanField

支持Null、True、False三种值。

CharField(max_length=最大长度)

字符串。参数max_length表示最大字符个数,必须写。

TextField

大文本字段,一般超过4000个字符时使用。

IntegerField

整数

DecimalField(max_digits=None, decimal_places=None)

十进制浮点数。参数max_digits表示总位。参数decimal_places表示小数位数。

FloatField

浮点数。参数同上

DateField:([auto_now=False, auto_now_add=False])

1、参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。

2、参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。

3、参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。

TimeField

时间,参数同DateField。

DateTimeField

日期时间,参数同DateField。

FileField

上传文件字段。

ImageField

继承于FileField,对上传的内容进行校验,确保是有效的图片。

(三)选项(实现字段的约束)

选项名

描述

default

设置默认值

primary_key

True:主键字段,默认值为false

unique

True:字段中为唯一值,默认为false

db_index

True:表中为此字段创建索引,默认为false

db_column

字段的名称,如果未制定,则用属性的名称

null

True:表示允许为空,默认值为false

blank

True:该字段允许为空白,默认为false

1、null和blank对比:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的。

2、当修改模型类之后,如果添加的选项不影响表的结构,则不需要重新做迁移,商品的选项中default和blank不影响表结构。

3、一般不需要记,参考文档:http://python.usyiyi.cn/translate/django_182/index.html

 

四、查询(重点)

(一)mysql日志文件

1、ubunto中:

1⃣打开mysql配置文件,去除68,69行的注释,然后保存。

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

2⃣重启mysql服务,就会产生mysql日志文件。

sudo service mysql restart

3⃣/var/log/mysql/mysql.log 是mysql日志文件所在的位置

4⃣sudo tail -f /var/log/mysql/mysql.log(不能用vi打开)

2、mac中:

1⃣mysql> set global general_log=on;

2⃣mysql> show variables like ‘general_log_file’;

3⃣sudo tail -f /usr/local/mysql/data/MacBook-Air.log 查看的绝对路径

4⃣注意:在vi中不能动态查看日志的内容。

(二)查询函数

通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。

函数名

功能

返回值

说明

get

返回表中满足条件的一条且只能有一条数据。

返回值是一个模型类对象

1、如果查到多条数据,则抛异常MultipleObjectsReturned。

2、查询不到数据,则抛异常:DoesNotExist。

all

返回模型类对应表格中的所有数据。

返回值是QuerySet类型

查询集

filter

返回满足条件的数据。

返回值是QuerySet类型

参数写查询条件。

exclude

返回不满足条件的数据

返回值是QuerySet类型

参数写查询条件。

order_by

对查询结果进行排序。

返回值是QuerySet类型

参数中写根据哪些字段进行排序。

<练习>

1、查询图书id为3的信息

2、查询图书所有的信息

3、模型类属性名__条件名=值

4、查询图书评论量为34的图书信息。

5、查询编号为1的图书

6、判等查询(exact)

例:查询编号为1的图书。

7、模糊查询(contains,endswith,startswich)

例1:查询书包含"传"的图书

例2:查询书名以“部”结尾的图书。

8、空查询(isnull)

例:查询书名不为空的图书

9、范围查询(in)

例:查询id为1,3,5的图书

10、比较查询(gt,lt,gte,lte)

例:查询d大于3的图书

11、日期查询(year,day等)

例:查询1980年发表的书

12、exclude方法和filter方法相:

例:查询id不为3的图书

13、order_by:进行结果集排序:order_by里装的是字符串

例:把id大于3的图书信息按阅读量从大到小排序显示。

 

(三)F对象(作用于类属性(字段)之间的比较) 如果只是字段,需要是字符串形式

使用之前必须先导入:from django.db.models import F

例:查询图书阅读量大于2倍评论量的图书信息

(四)Q对象(作用于查询时条件的之间的逻辑关系,&,|,~)

使用之前必须先导入:from django.db.models import Q

例1:查询id大于3或者阅读量大于30的图书的信息。

例2:查询id不等于3图书的信息。

BookInfo.objects.filter(~Q(id=3))

(五)聚合函数(对查询集进行聚合操作)

1、aggregate:调用这个函数来使用聚合,返回的是一个字典。

2、导入聚合类:from django.db.models import Sum,Count,Max,Min,Avg

例:查询所有图书阅读量的总和。

3、count:返回的是一个数字。

例:统计id大于3的所有图书的数目

BookInfo.objects.filter(id__gt=3).aggregate(Count('id'))

BookInfo.objects.filter(id__gt=3).count()

 

五、查询集

(一)查询集特性

1、惰性查询:只有在实际使用查询集中的数据的时候才会发生数据库真正的查询。

2、缓存:当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。

(二)限制查询集

1、可以对一个查询集进行取下标或者切片操作来限制查询集的结果。

2、对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。

3、查询集的两种方式。

方式

说明

b[0]

如果b[0]不存在,会抛出IndexError异常

b[0:1].get()

如果b[0:1].get()不存在,会抛出DoesNotExist异常

4、exists判断一个查询集中是否有数据。True,False

(三)模型类关系

1、一对多关系:(图书类->英雄类)

models.ForeignKey() 定义在多的类中

2、多对多关系:(新闻类->新闻类型剋)

models.ManyToManyField() 定义在哪个类中都可以

3、一对一关系:(员工基本信息类-员工详情信息类)

models.OneToOneField定义在哪个类中都可以

 

六、关联查询(一对多)

(一)查询和对象关联的数据

1、在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性。

例1:查询id为1图书的英雄信息。

例2:查询id为1的英雄图书信息。

(二)通过模型类实现关联查询

1、通过多类条件查询一类的数据:

一类名.objects.filter(多类名小写__多类属性名__条件名)

2、通过一类的条件查询多类的数据:

多类名.objects.filter(关联属性__一类属性名__条件名)

例:查询图书信息,要求图书关联的英雄的描述包含'八'。

BookInfo.objects.filter(heroinfo__hcomment__contains="八")

例:查询图书信息,要求图书中的英雄的id大于3

BookInfo.objects.filter(heroinfo__id__gt=3)

例:查询书名为“天龙八部”的所有英雄。

HeroInfo.objects.filter(hbook__btitle="天龙八部")

(三)自关联

1、自关联是一种特殊的一对多关系。

例:显示广州市的上级地区和下级地区。

 

七、管理器(重点)

(一)objects是什么?

1、objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。

2、objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。

(二)如何自定义管理器类?

1、自定义一个管理器类,这个类需要继承models.Manager类。

2、再进行定义一个管理器类的对象。

(三)自定义管理器类的应用场景

1、改变查询集的结果集:

比如说:用all方法查询的是全部数据,我们可以通过重写all 方法来实现,返回的结果集是没有逻辑删除的。

2、添加额外的方法:

可以封装一些增删改的方法。

(四)self.model()用法

如果直接在自定义管理器中要使用类:b = BookInfo(),用b对象去实现增删改查,那么如果将模型类的名字修改后,就无法再在自定义管理器类中使用b对象,那么我们就需要用self.model()来创建出来一个b,无论你的模型类怎么改,都不影响。

 

八、元选项

1、Django默认生成的表名:应用名小写_模型类名小写。

2、如果想修改表名:需要在模型类中定义一个猿类Meta,在里面定义一个类属性db_table就可以指定表名。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值