使用django ORM 访问数据库,如果想实现or操作,需要用到django.db.models.Q
,形如:
from django.db.models import Q
from myApp.models import myDBTable
rows = myDBTable.objects.filter(Q(col_name=col_value1)|Q(col_name=col_value2)) # select * from my_db_table where (col_name = col_value1 or col_name=col_value2)
现在我有一个需求,用户会从前端给我传一个列表过来,我要去搜索出数据库表中某一列匹配列表中任何一项的数据,也就是多个or的情况。但是在执行代码之前,我是不知道用户会给我传哪些参数、传多少个参数的。简单思考了一下,想到可以这样做:
from django.db.models import Q
from myApp.models import myDBTable
filter = None
for item in params_list:
filter = Q(col_name=item) if filter is None else filter|Q(col_name=item)
rows = myDBTable.objects.filter(filter)
怎么想到的:Q(col_name=col_value1)应该是一个对象,Q(col_name=col_value1)|Q(col_name=col_value2) 应该也是一个对象。那么既然是对象,就可以用上面的这种方法处理。
经过测试是可行的。
done。