广州番禺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学习资料: