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将获得相反的数据