广州番禺Python, Java小班周末班培训
薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:https://my.pythoncn.com/?cate=6
5.8.1 字段查询
使用QuerySet中的字段查询可以构造一个复杂的where子句,字段查询可用于QuerySet对象的filter,exclude,get等方法中。QuerySet中的字段查询采用field__lookuptype的查询格式:field表示模型中的字段名,lookuptype表示字段查询的类型。
常用的字段查询类型:
(1) exact
exact表示精确匹配,在exact类型中加上一个i的前缀,表示忽略大小写, 否则表示区分大小写。传递None值时,表示在数据库中查询字段值为NULL的数据。
代码实例:
Blog.objects.filter(id__exact=1)
上述代码表示筛选出id值为1的数据。
Blog.objects.filter(title__iexact='python')
上述代码表示筛选出title值为python(忽略大小写)的数据。
(2) contains
contains表示模糊匹配,同样可以在类型前面加上一个i的前缀,表述忽略大小写。
代码实例:
Blog.objects.filter(title__icontains='python')
上述代码表示筛选出title中包含字符串'python'(忽略大小写)的数据。
(3) in
成员匹配,用来查询在一个集合中的数据,通常传递一个可迭代对象,例如列表,元组,字符串。
代码实例:
Blog.objects.filter(category__in=(0,1))
上述代码表示筛选出category值为0或1的数据。也可以将QuerySet对象作为参数传递给in操作符。
代码实例:
inner_qs = Blog.objects.filter(title__icontains='python') Blog.objects.filter(author__in=inner_qs)
上述代码表示先获取在数据库中title包含python(不区分大小写)的所有数据,然后以此为基准,获取author值为基准数据中的所有数据。例如基准数据中的author值为:'红炉点雪','Backer',则代码Blog.objects.filter(author__in=inner_qs),表示从数据库中筛选出作者为'红炉点雪'或'Backer'的所有数据。
(4) gt,gte,lt,lte
gt,gte,lt,lte分别表示关系运算中的大于,大于等于,小于,小于等于。
代码实例:
Blog.objects.filter(id__gte=1)
上述代码表示从数据库中筛选出idine: none; color: rgb(74, 74, 74); transition: all 0.35s ease 0s; outline: 0px; border-bottom: 2px solid rgb(132, 207, 109); margin: 0px; padding: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-size: 16px;">Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲 startswith,endswith分别表示以特定的子字符串作为前缀,后缀。 代码实例: 上述代码表示从数据库中筛选出title值以'python'作为前缀的所有数据。 (6) range 使用range来表示范围匹配。 代码实例: 上述代码表示从数据库中筛选出pub_date在2019年1月1日到2019年3月31日之间的所有数据。 (7) date 使用date来进行日期匹配。 代码实例: 上述代码表示从数据库中筛选出pub_date为2019年11月21日的所有数据。在进行日期匹配中,可与关系运算类型gt,gte,lt,lte等组合成复合查询。 代码实例: 上述代码表示从数据库中筛选出pub_date大于等于2019年11月21日的所有数据。 (8) year,mongth, day year,mongth, day分别表示进行年份,月份,日份的匹配。 代码实例: 上述代码表示从数据库中筛选出pub_date的年份为2019的所有数据。同样可以与关系运算类型gt,gte,lt,lte等组合成复合查询。 代码实例: 上述代码表示从数据库中筛选出pub_date的年份大于等于2018的所有数据。 (9) isnull isnull表示从数据库中查询值是否为NULL的数据。 代码实例: 上述代码表示从数据库中筛选出pub_date为NULL的所有数据。 (1) QuerySet.order_by(*fields) 使用order_by方法可以覆盖在Meta类中定义的排序方式。fields表示传递排序的字段名。在字段名前面加-符号表示降序排序,?表示随机排序,不加任何符号表示按升序排序。 代码实例: 上述代码表示在数据库中根据id进行降序排序。 (1) QuerySet.distinct(*fields) 可选的参数fields表示根据特定的字段来进行数据去重,Django目前的实现中仅支持 PostgreSQL数据库。当使用其它类型的数据库时,distinct方法不能携带任何参数,需结合values方法来进行数据去重。 代码实例: 上述代码表示对author字段进行去重。 代码实例: 上述代码同样表示对author字段进行去重,但仅支持PostgreSQL数据库。 QuerySet.extra(select=None,where=None, params=None,tables=None, order_by=None, select_params=None) 通过QuerySet的extra方法来构造一个复杂的WHERE子句。select参数是一个字典类型,键名为查询语句的结果的别名,键值为对应的查询语句(可以是一个查询子语句)。select_params是一个元组类型,表示SELECT语句的参数。 代码实例: 在上述代码中查询表达式"pub_date > '2006-01-01'"的结果,并将结果的别名设置为is_recent。使用select_params来传递参数: 上述代码同样是查询表达式"pub_date > '2006-01-01'"的结果,并将结果的别名设置为is_recent。where参数是一个列表,用来构造where子句,列表中存在多个条件时,表示AND关系, params表示传递给where语句的参数。 代码实例: order_by参数的用法同QuerySet中的order_by方法。 代码实例: (1) QuerySet.aggregate(*args, **kwargs) 使用aggregate来进行聚合查询,例如查询数据列的最大值,最小值,平均值, 进行求和,数量统计等。aggregate返回的结果为一个字典类型,字典键名的默认格式:field__method。field表示字段名,method表示聚合方法。django内置的聚合方法:Max,Min,Avg,Sum,Count,分别表示对数据列计算最大值,最小值,平均值,求和,数量统计。聚合方法需从django.db.models中进行导出。 代码实例: 通过在aggregate方法中指定关键字参数,可以覆盖默认的键名格式。代码实例: (1) QuerySet.annotate(*args, **kwargs) 使用annotate来进行分组查询,参数用法同aggregate,返回的结果为QuerySet对象。annotate方法默认根据主键进行分组,如需按指定的字段进行分组,需结合values方法。为便于进行代码演示,先准备一张数据表programmer (id为主键): id name sex 1 小美 女 2 小丽 女 3 小草 男 代码实例: 在执行annotate方法前,先在values方法中指定字段名,可以按指定的字段进行分组。 代码实例: 在django中,可以使用F查询来直接表示模型字段的值。使用F表达式的优势在于,无需将模型字段的值预先从数据库导入到python内存中,django会自动将F表达式转换为SQL语句。定义一个表示程序员的模型: 时光又流逝了一年,现在将程序员的年龄全部加一岁。不使用F表达式的代码实例: 使用F表达式的代码实例: Q查询类似于F查询,两者的区别:Q查询是一个对象,F查询是一个表达式。Q查询在对象内部封装了SQL表达式,使用Q对象时,通过组合& 、|、~等操作符,可以构造复杂的数据库查询(&表示逻辑与,|表示逻辑或,而~表示逻辑非)。使用Q对象查询年纪大于35岁且薪水小于15000, 且未婚的程序员: 然后全部删除: 薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。 扫码免费领取Python学习资料:Blog.objects.filter(title__startswith='python')
import datetime
start_date = datetime.date(2019, 1, 1)
end_date = datetime.date(2019, 3, 31)
Blog.objects.filter(pub_date__range=(start_date, end_date))
import datetime
Blog.objects.filter(pub_date__date=datetime.date(2019,11,21))
import datetime
Blog.objects.filter(pub_date__date__gte=datetime.date(2019,10,21))
Blog.objects.filter(pub_date__year=2019)
Blog.objects.filter(pub_date__year__gte=2018)
Blog.objects.filter(pub_date__isnull=True)
5.8.2 数据排序
Blog.objects.order_by('-id')5.8.3 数据去重
Blog.objects.values('author').distinct()Blog.objects.distinct('author')5.8.4 Extra查询
Blog.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})Blog.objects.extra(select={'is_recent': "pub_date > '%s'"}, select_params=('2006-01-01',))Blog.objects.extra(where=["author='%s' OR "author='%s'", "title = '%s'"],params=('Backer','Lohan','python'))q = Blog.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
q = q.extra(order_by=['-is_recent'])5.8.5 聚合查询
from django.db.models import Max,Min
class Book(models.Model):
price = models.FloatField()
Book.objects.aggregate(Max('price'),Min('price'))
'''
执行aggregate方法返回的结果格式:
{'price__max': 99, 'price__min': 18}
'''from Django.db.models import Max,Min
class Book(models.Model):
price = models.FloatField()
# 在aggregate方法中指定关键字参数,可以覆盖默认的键名格式
Book.objects.aggregate(max_price=Max('price'), min_price=Min('price'))
'''
执行aggregate方法返回的结果格式:
{'max_price': 99, 'min_price': 18}
'''5.8.6 分组查询
from django.db.models import Count
# 默认按主键id进行分组
Programmer.objects.annotate(Count('sex'))
'''
执行annotate方法返回的结果:
<QuerySet [{'id': 1, 'name': '小美','sex': '女','sex__count': 1},
{'id': 2, 'name': '小丽','sex': '女','sex__count': 1},
{'id': 3, 'name': '小草','sex': '男','sex__count': 1}]>
'''from Django.db.models import Count
# 默认按主键id进行分组
Programmer.objects.values('sex').annotate(Count('sex'))
'''
执行annotate方法返回的结果:
<QuerySet [{'sex': '女','sex__count': 2},
{'sex': '男','sex__count': 1}]
>
'''5.8.7 F查询与Q查询
class Programmer(models.Model):
name = models.CharField(max_length=10)
salary = models.IntegerField(default=3000)
age = models.IntegerField(default=18)
married = models.BooleanField(default=True)
programmers = Programmer.objects.all()
# 批量更新时,得先从数据库中取出模型字段的值
# 访问模型字段时会触发QuerySet的evaluate
for programmer in programmers:
programmer.age = programmer.age+1
from django.db.models import F
# 直接使用F表达式来表示模型字段的值,无需从数据库中读出数据,提升了查询性能
# django会自动将F表达式转换为数据库中的SQL语句
Programmer.objects.update(age=F('age')+1)from django.db.models import Q
inner_qs=Programmer.objects.filter(Q(salary__lt=15000) & Q(age__gt=35) & ~Q(married=True))
inner_qs.delete()
5.8.8 最具实力的小班培训
(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4) Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

