Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第五章: django模型 > 5.7节: QuerySet基本操作

5.7节: QuerySet基本操作

薯条老师 2020-08-10 14:33:52 235167 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

5.7.1 构造模型对象

在ORM中,模型类型对应的是数据库中的数据表,模型实例化后的对象对应的是数据表中的一行记录。例如定义一个Blog模型:

class Blog(models.Model):
    title = models.CharField(max_length=50)
    cotent =  models.TextField()
    author =  models.CharField(max_length=20)
 
    class Meta:
        db_table = 'blog'

Blog类型对应于数据库中的数据表blog,对Blog进行实例化,相当于构造了数据表中的一行记录。构造模型对象主要有以下两种方法:

 (1) 调用模型类的构造函数

在模型类的构造函数中以字段名作为关键字参数,来进行对象的实例化。

代码实例:

blog = Blog(title='遇见Django-轻松掌握web开发', content='敬请期待',author='红炉点雪')

亦可先构造一个空对象,然后以成员操作符的形式,对模型字段进行赋值:

blog = Blog()
blog.title = '遇见Django-轻松掌握web开发'
blog.content = '敬请期待'
blog.author = '红炉点雪'

(2) 使用QuerySet API

执行模型类的objects方法,会返回一个QuerySet对象,调用QuerySet的create方法,可以创建一个模型对象(关于QuerySet对象,在5.7.3节中会进行详细介绍)。在create方法中,同样以字段名作为关键字参数。

代码实例

blog = Blog.objects.create(title='遇见Django-轻松掌握web开发', content='敬请期待',author='红炉点雪')

5.7.2 模型对象的save方法

save方法有两种作用,在首次构造模型对象时,执行save方法,相当于进行数据插入。在获取到已存在的模型对象,再执行save方法时,相当于数据更新。使用save方法进行数据插入:

blog = Blog()
blog.title = '遇见Django-轻松掌握web开发'
blog.content = '敬请期待'
blog.author = '红炉点雪'
 
# 现在执行的是数据插入
blog.save()
 
# 使用save方法进行数据更新:
blog = Blog.objects.get(id=1)
blog.title = '趣学Django-轻松掌握web开发'
 
# 现在执行的是数据更新
blog.save()

上文代码中的Blog.objects.get(id=1),也可以写成Blog.objects.get(pk=1),关键字参数pk表示数据表中的主键。在5.7.1节与5.7.2节中,分别使用了QuerySet API进行模型对象的创建,以及数据的查询。利用django内置的QuerySet API,可以方便地对数据库进行CRUD操作。

CRUD,即Create, Read, Update, Delete,分别对应于数据库的创建、读取、更新、删除操作。

5.7.3 QuerySet对象

通过模型的objects方法可以返回一个QuerySet对象。QuerySet可以被构造,过滤,切片,以及做为参数传递,这些行为都不会对数据库进行操作,只有对QuerySet对象进行evaluate的时候才会真正的操作数据库。evaluate可以理解为在数据库中执行QuerySet中的查询语句。

QuerySet基于惰性查询,只有在对QuerySet对象进行evaluate的时候,才会触发对数据库的操作。对QuerySet对象进行evaluate, 可以通过以下几种方式:

(1) 迭代

QuerySet 是可迭代的类型,在循环中遍历字段的值时会触发evaluate操作。

 

(2) 切片

QuerySet对象可以通过python中的切片语法来进行切片,切片操作不支持负数索引,对未evaluate的QuerySet对象进行切片,返回的是一个新的QuerySet对象,除非在操作中使用了步长参数(切片语法中的step),才会被evaluate。

 

(3) 序列化/缓存化

对QuerySet对象进行序列化操作,也会进行evaluate。QuerySet包含一个缓存来最小化对数据库的访问。在一个新创建的QuerySet对象中,缓存为空。首次执行QuerySet中的查询语句,Django会将返回的结果缓存到QuerySet对象中,在接下来对该QuerySet对象的求值将重用缓存的结果。

 

(4) repr()

对QuerySet对象执行repr()方法,会触发evaluate操作。

 

(5) len()

调用 QuerySet 的 len() 方法,返回查询结果的数目。注意:直接在数据库层面使用 SQL 的 SELECT COUNT(*) 方法来获取数据的条数会更加高效在实际开发中,可以使用QuerySet对象的count()方法来替代len()。

 

(6) list()

将QuerySet 对象转换为列表类型。

注意:使用这个方法会占用大量内存,因为 Django 将列表内容都载入到内存中。

(7) bool()

测试QuerySet对象的布尔值时,也会对queryset对象进行evaluate。

5.7.4 QuerySet基本操作

1. 创建模型对象

(1) QuerySet.create(**kwargs)

使用模型字段名作为create方法的关键字参数,返回值为模型对象。

 

代码实例

blog = Blog.objects.create(title='遇见Django-轻松掌握web开发', 
                              content='敬请期待', author='红炉点雪')

(2) QuerySet.get_or_create(**kwargs)

使用模型字段名作为get_or_create方法的关键字参数,返回值为一个元组类型,格式为:(object, success),object表示模型对象,success表示是否创建成功。get_or_create方法会先在数据库中进行查询,如果数据已存在,则使用已有的数据来构造一个模型对象,否则新建一个模型对象。

 

代码实例:

blog, success = Blog.objects.get_or_create(pk=2,title='遇见python', 
                       content='敬请期待', author='红炉点雪')

(3) QuerySet.builk_create(model_objects)

model_objects是一个列表类型,列表中的元素为实例化后的模型对象,使用builk_create方法对模型对象进行批量创建。


代码实例:

blogs = list()
 
data=[{'title':'xxx','content':'xxx','author':'xxx'}, 
      {'title':'xxx','content':'xxx','author':'xxx'}]
 
for item in data:
    blogs.append(Blog(title=item['title'],content=item['content'],
    author=item['author']))
 
Blog.objects.bulk_create(blogs)

2. 数据库的读取操作

(1) QuerySet.get(**kwargs)

使用模型字段名作为get方法的关键字参数,返回一个模型对象,数据不存在或存在多条数据时,会引发异常。

 

代码实例:

blog = Blog.objects.get(pk=2)

上文代码表示获取主键为2的数据,如果数据不存在,会抛出数据不存在的异常信息。

blog = Blog.objects.get(author='红炉点雪')

上文代码表示获取author字段值为红炉点雪的数据,如果数据不存在或有多条数据, 会抛出异常。

 

(2) QuerySet.filter(**kwargs)

filter方法返回一个QuerySet对象,该QuerySet对象保存了一个列表,列表中的元素是模型实例化后的对象。在filter方法中传递字段查询的过滤条件。在filter方法中传递多个字段参数时,过滤条件在SQL语句中是AND关系。

代码实例:

query_set_object = Blog.objects.filter(pk=1)

上文代码表示筛选出主键为1的QuerySet对象。

 

代码实例:

query_set_object = Blog.objects.filter(author='红炉点雪',title='遇见python')

上文代码表示筛选出author值为'红炉点雪',且title值为'遇见python'的QuerySet对象。使用QuerySet中的字段查询可以构造一个复杂的数据库where子句。QuerySet中的字段查询采用field__lookuptype的查询格式:field表示模型中的字段名,lookuptype表示字段查询的类型。在5.8节中,会继续对字段查询进行讲解。

 

(3) QuerySet.exclude(**kwargs)

exclude方法是filter方法的反面,filter方法用于返回与过滤条件相匹配的数据,而exclude方法用于排除与过滤条件相匹配的数据。

代码实例:

query_set_object = Blog.objects.exclude(author='红炉点雪',title='遇见python')

上文代码表示返回author值不等于'红炉点雪',且title值不等于'遇见python'的QuerySet对象。filter方法与exclude方法返回的均为QuerySet对象,可以使用链式表达式。

代码实例:

query_set_object = Blog.objects.filter(title='python').exclude(author='红炉点雪')

上文的代码表示先使用title值'python'对数据进行筛选,然后再排除author值为'红炉点雪'的数据。

 

(4) QuerySet.all()

执行all方法,返回当前所有数据的一个副本。对返回值可以执行切片操作。

 

(5) QuerySet.values(*fields)

返回一个QuerySet对象,该QuerySet对象保存了一个列表,列表中的元素是一个字典象,

 

代码实例:

Blog.objects.values()

假设Blog中的字段为author,title,content,则字典对象的格式为:

{'id':1,'author':'红炉点雪','title':'遇见Django','content':'敬请期待'}

可选的fields参数用来指定数据中出现的字段,其它字段未指定时不会出现在字典中。

代码实例:

Blog.objects.values('author')

则字典对象的格式为:

{'author':'红炉点雪'}

3. 数据库的更新操作

对数据库进行更新操作,可以直接调用模型的save方法来执行单条数据的更新。也可以通过QuerySet的update方法,来进行数据的批量更新。

 (1) QuerySet.update(**kwargs)

使用模型字段名作为update方法的关键字参数,来对数据进行批量更新。

代码实例:

Blog.objects.filter(author='红炉点雪').update(status=0)

在上述代码中将author值为'红炉点雪'的status值批量更新为0。

 

4. 数据库的删除操作

(1) QuerySet.delete()

使用delete方法来对数据进行批量删除。

代码实例:

Blog.objects.filter(author='红炉点雪').delete()

在上述代码中将author值为'红炉点雪'的数据全部删除。

5.7.5 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:

TAGS:QuerySetCURD

欢迎 发表评论: