Django查询条件都是使用field+__+condition的方式来使用的

1、
exact   会被翻译成 = 
iexact  会被翻译成 LIKE
exact和iexact的区别,其实就是 = 和 LIKE 的区别;

article = Article.objects.get(id=14)
article = Article.objects.get(id__exact=14)
以上两个查找是等价的,翻译成SQL语句如下:
select * from article where id=14

article = Article.objects.filter(title__iexact='hello world')
翻译成SQL语句如下:
select * from article where title like 'hello world'

总结:因为 field_exact = xxx 等价于 field = xxx 而且大部分情况下 exact等价于 iexact因此我
们直接使用 field = xxx 就可以了

None在SQL层面会被解释为NULL
article = Article.objects.get(id__exact=None)
翻译成SQL语句如下:
select * from article where id IS NULL;


2、contains:判断某个字符串中是否包含了某个元素,大小写敏感
   icontains:判断某个字符串中是否包含了某个元素,大小写不敏感

articles = Article.objects.filter(title__contains='hello')
翻译成SQL语句如下:
select * where title like binary '%hello%';  (like binary代表大小写敏感)

articles = Article.objects.filter(title__icontains='hello')
翻译成SQL语句如下:
select * from article where title like '%hello%';

总结:contains和icontains在被翻译成SQL的时候LIKE带百分号;而iexact没有百分号,那么意味着只有
完全相等的时候才会匹配到

3、in:查询某字段的值是否在给定的list, tuple,QuerySet对象

articles = Article.objects.filter(id__in=[1,2,3])
翻译成SQL语句如下:
select * where id in (1,3,4)

获取文章标题包含hello的所有分类:
list = Article.objects.filter(title__contains='hello')
categories = Category.objects.filter(article__in=list)

翻译成SQL语句如下:
select * from category where article.id in (select id from article where title like '%hello%');

4、

gt   大于     (greater than)
gte  大于等于 (greater than equal)

lt   小于     (less than)
lte  小于等于 (less than equal)

articles = Article.objects.filter(id__gt=4)
翻译成SQL语句如下:
select * where id > 4

5、
startswith    以xxx字符串开头的数据(大小写敏感)
istartswith   以xxx字符串开头的数据(大小写不敏感)

endswith      以xxx字符串结尾的数据(大小写敏感)
iendswith     以xxx字符串结尾的数据(大小写不敏感)

提取所有标题以hello字符串开头的文章
articles = Article.objects.filter(title__startswith='hello')
articles = Article.objects.filter(title__istartswith='hello')
翻译成SQL语句如下:
select * where title like binary 'hello%'   (like binary代表大小写敏感)
select * where title like 'hello%'

6、range(判断某个field的值是否在给定的区间中)
提取所有发布时间在2018/1/1到2018/12/12之间的文章:
from django.utils.timezone import make_aware
from datetime import datetime

start_date = make_aware(datetime(year=2018,month=1,day=1))
end_date = make_aware(datetime(year=2018,month=12,day=12))

articles = Article.objects.filter(createtime__range=(start_date,end_date))
翻译成SQL语句如下:
select * from article where createtime between '2018-01-01' and '2018-12-12'

因为我们在settings.py中指定了USE_TZ=True,并且设置了TIME_ZONE='Asia/Shanghai',因此我们在
提取数据的时候要使用django.utils.timezone.make_aware先将datetime.datetime从navie时间转
换为aware时间。make_aware会将指定的时间转换为TIME_ZONE中指定的时区的时间。

7、data:根据,年月日来进行查找(查找时间为2018/10/10这一天发表的所有文章)
articles = Article.objects.filter(createtime__date=datetime(year=2018,month=10,day=10))
articles = Article.objects.filter(createtime__date=date(2018,10,10))
翻译成SQL语句如下:
select * WHERE DATE(CONVERT_TZ(`article`.`createtime`, 'UTC', 'Asia/Shanghai')) =
2018-10-10

8、time:根据,时分秒进行查找
以上的代码是获取每一天中12点12分12秒发表的所有文章
articles = Article.objects.filter(createtime__time=datetime.time(12,12,12));

9、year/month/day   根据,年/月/日,进行查找(year/month/day 用法都相同,下面只列举了year的
用法)
查找2018这一年发表的所有文章:
articles = Article.objects.filter(createtime__year=2018)
翻译成SQL语句如下:
select * where createtime between '2018-01-01' and '2018-12-31';

查找年份大于等于2017,发表的所有文章:
articles = Article.objects.filter(createtime__year__gte=2017)
翻译成SQL语句如下:
select * where createtime >= '2017-01-01';

10、week_day  根据星期来进行查找,1->星期日,7->星期六
查找星期五,发表的所有文章:
articles = Article.objects.filter(createtime__week_day=4)
翻译成SQL语句如下:
SELECT * WHERE django_datetime_extract('week_day', "article"."createtime", 'Asia/Shanghai') = 4

11、isnull:根据值是否为空进行查找(设置成True为空,False不为空)
获取所有发布日期不为空的文章
articles = Article.objects.filter(pub_date__isnull=False)
翻译成SQL语句如下:
select * where createtime is not null

12、
regex   写正则表达式去查询(大小写敏感)
iregex  写正则表达式去查询(大小写不敏感)

提取所有标题以hello字符串开头的文章
articles = Article.objects.filter(title__regex=r'^hello')
翻译成SQL语句如下:
select * where title regexp binary '^hello'

 

你可能感兴趣的:(django)