django 查询集选择器(代替不等号)

django 中用于取代sql,用于数据表查询的语法叫做ORM查询集,但是在实用查询集的时候一般只能通过filter获取等值属性,例如:OB.filter(number=3),而一旦使用不等号,就会报错例如:

q = OB.objects.filter(number > item.number)
NameError: name 'number' is not defined

或者:

q = OB.objects.filter('number' > 'item.number')
TypeError: 'bool' object is not iterable

但是实际情况上来说,很多时候直接使用不等号会更加方便减少多行代码,减少逻辑混乱的风险,而django就提供了过滤器这一选项。

以下便是几种较常用的选择器:(带有OB的表示是对象自带的属性)

__exact        精确等于

q = OB.objects.filter(name__exact='apPle')
获取name属性为apPle的数据,大小写严格对应

__iexact    精确等于 忽略大小写

q = OB.objects.filter(name__exact='apPle')
获取name属性为apple(APPLE或Apple。。。)的数据,忽略大小写

__contains    包含

q = OB.objects.filter(name__contains='list')
获取name属性中包含list字符的数据

__icontains    包含 忽略大小写,但是对于sqlite来说,contains的作用效果等同于icontains

同上但是忽略大小写

__gt    大于

q = OB.objects.filter(date__gte=datetime.date.today())
获取date属性大于当前时间的数据(时间上的大于应该指的是过去吧)

__gte    大于等于

q = OB.objects.filter(number__gte=3)
获取number属性大于3的数据

__lt    小于

q = OB.objects.filter(OB_number__lt=OB_pro_number)
获取自带的number属性值小于自带的pro_number属性的数据 

__lte    小于等于

__in     存在于一个list范围内

q = OB.objects.filter(name__in=listA)
获取name属性的值在listA表单中的数据,例如获取名字在优惠商品名称数组中的商品

__startswith   以...开头

q = OB.objects.filter(name__startswith='AP')
获取name属性以AP开头的数据(大小写严格)

__istartswith   以...开头 忽略大小写......效果同上,但是忽略大小写

__endswith     以...结尾

q = OB.objects.filter(name__startswith='LE')
获取name属性以LE结尾的数据,大小写严格

__iendswith    以...结尾,忽略大小写......效果同上,但是忽略大小写

__range    在...范围内

q = OB.objects.filter(date__range=["2011-01-01", "2011-01-31"])
获取date属性值在这个日期之间的数据

__year       日期字段的年份

q = OB.objects.filter(date__year=2017)
获取date属性的年份字段为2017的数据

__month    日期字段的月份

q = OB.objects.filter(date__year=4)
获取date属性的月份字段为4的数据

__day        日期字段的日

q = OB.objects.filter(date__year=20)
获取date属性的日期字段为20的数据

__isnull=True/False

q = OB.objects.filter(name__isnull=True) 
获取name属性值为空的数据

同时与filter相反的Object属性为exclude

filter表示=,exclude表示!=

将上述语句中的filter替换成exclude将获得相反的数据

相关推荐