查询语句格式
类名.objects.[查询条件]
必知必会十三个查询条件:
<1> all(): 查询所有结果
Article.objects.all()
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
1、exact:使用精确的 = 进行查找。如果提供的是一个 None ,那么在 SQL 层面就是被解释为 NULL 。
示例代码如下:
article = Article.objects.get(id__exact=14) #等价与: article = Article.objects.get(id=14)
article = Article.objects.get(id__exact=None)
以上的两个查找在翻译为 SQL 语句为如下:
select ... from article where id=14;
select ... from article where id IS NULL;
2、iexact:使用 like 进行查找。
示例代码如下:
article = Article.objects.filter(title__iexact='hello world')
那么以上的查询就等价于以下的 SQL 语句:select ... from article where title like 'hello world';
注意:上面这个sql语句,因为在MySQL中,没有一个叫做ilike的,所以iexact和exact的区别实际上就是LIKE和=的区别,而且,field__exact=***其实就是“field=***”,在大部分collation=utf8_general_ci 情况下都是一样的( collation 是用来对字符串比较的)。
因此,实际开发中使用exact和iexact很少,直接使用:field=*** 即可。
3、contains:模糊查询,大小写敏感,
示例代码:article = Article.objects.filter(title__contains="论")
等价SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE BINARY %论%
4、icontains: 与contains类似,大小写不敏感,
示例代码:article = Article.objects.filter(title__ icontains="论")
等价SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE %论%
5、in :与SQL中in条件等价
示例代码:article = Article.objects.filter(title__in=[1,3])
等价SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` IN (1, 3)
6、gt、gte、lt、lte :等价于SQL中的大于、大于等于、小于、小于等于
gt:great than、gte:great than equal、lt:lower than、lte:lower than equal
示例代码:articles = Article.objects.filter(id__gt = 2)
等价SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id` FROM `article` WHERE `article`.`id` > 2
7、startswith 与istartswith:判断字段是否以某个值开始,等于模糊查询
startswith:大小写敏感;istartswith:大小写不敏感
示例代码:article = Article.objects.filter(title__startswith='论')
等价SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id` FROM `article` WHERE `article`.`title` LIKE BINARY 论%
8、endswith 与iendswith:判断字段是否以某个值结束,等于模糊查询
endswith:大小写敏感;iendswith:大小写不敏感
示例代码:article = Article.objects.filter(title__endswith='首')
等价SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id` FROM `article` WHERE `article`.`title` LIKE BINARY %首
9、range:等价于SQL的between * and *
示例代码:
#先定义开始结束日期, 并使用make_aware 定义时区
from datetime import datetime
from django.utils.timezone import make_aware
start_time =make_aware(datetime(year=2019,month=8,day=16,hour=0,minute=0,second=0))
end_time = make_aware(datetime(year=2019,month=8,day=18,hour=0,minute=0,second=0))
articles = Article.objects.filter(create_time__range=(start_time,end_time))
等价SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time`, `article`.`create_date` FROM `article` WHERE `article`.`create_time` BETWEEN 2019-08-16 00:00:00 AND 2019-08-18 00:00:00
10、date、year、month、day
articles = Article.objects.filter(create_time__date=datetime(year=2019,month=8,day=16))
articles = Article.objects.filter(create_time__year=2019)
articles = Article.objects.filter(create_time__month=2019)
articles = Article.objects.filter(create_time__day=2019)
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
<6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<7> order_by(*field): 对查询结果排序
<8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
<9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
<10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<11> first(): 返回第一条记录
<12>last(): 返回最后一条记录
<13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
返回QuerySet对象的方法有
all()、filter()、exclude()、order_by()、reverse()、distinct()
特殊的QuerySet
values() 返回一个可迭代的字典序列
values_list() 返回一个可迭代的元祖序列
返回具体对象的
get()、first()、last()
返回布尔值的方法有:
exists()
返回数字的方法有
count()