使用django ORM 訪問數(shù)據(jù)庫(kù),如果想實(shí)現(xiàn)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)
現(xiàn)在我有一個(gè)需求,用戶會(huì)從前端給我傳一個(gè)列表過來,我要去搜索出數(shù)據(jù)庫(kù)表中某一列匹配列表中任何一項(xiàng)的數(shù)據(jù),也就是多個(gè)or的情況。但是在執(zhí)行代碼之前,我是不知道用戶會(huì)給我傳哪些參數(shù)、傳多少個(gè)參數(shù)的。簡(jiǎn)單思考了一下,想到可以這樣做:
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)應(yīng)該是一個(gè)對(duì)象,Q(col_name=col_value1)|Q(col_name=col_value2) 應(yīng)該也是一個(gè)對(duì)象。那么既然是對(duì)象,就可以用上面的這種方法處理。
經(jīng)過測(cè)試是可行的。
done。