Django--ORM模型之查询

查询语句格式

类名.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()

你可能感兴趣的:(python,django)