Django
在Django中,假设有一个Model名叫Product,它有一个字段叫做description,类型对应MySQL的Text。
如果要对它进行与查询,多个条件同时满足,相对比较简单。例如,我希望查询:description字段同时包含关键字促销, 打折, 限时
from django.db.models import Q item = Product.objects.filter(Q(description__contains='促销') & Q(description__contains='打折') & Q(description__contains='限时'))
如果这些关键词是通过一个列表传进来的,但是我并不知道里面有哪些关键字,也不知道有几个关键字,那么还可以使用链式查询:
item = Product.objects for keyword in keywords: item = item.filter(description__contains=keyword)
循环结束以后,item就是同时满足所有关键字的搜索对象了。对于同一张表,上面两种写法是等效的。
那么问题来了,与查询很好写,或查询呢?
例如,查询Product,找到description字段包含下述关键字的任意一个促销, 打折, 限时的商品。
首先,或查询是不能用链式查询的。
如果关键字是确定的,当然你可以这样写:
from django.db.models import Q item = Product.objects.filter(Q(description__contains='促销') | Q(description__contains='打折') | Q(description__contains='限时'))
如果关键字是从外面传进来的怎么办呢?
如果关键字列表数量恒定,那么你可以这样写:
from django.db.models import Q keywords = ['促销', '打折', '限时'] item = Product.objects.filter(Q(description__contains=keywords[0]) | Q(description__contains=keywords[1]) | Q(description__contains=keywords[2]))
现在关键字的数量不确定,可能1个,可能3个,可能10个,这个时候怎么办?
此时,就需要把过滤条件单独抽出来进行或操作了:
from django.db.models import Q keywords = ['促销', '打折', '限时'] item = Product.objects if keywords: filters = Q(description__contains=keywords[0]) for keyword in keywords[1:]: filters |= Q(description__contains=keyword) item = item.filter(filters)
print(item.count()) # 此时打印出来的是所有在description字段包含任一关键字的商品总量
使用这种方式,就可以在Django中实现不定项数的或查询了。