2015-06-03 101 views
0

使用django,我想動態搜索跨多個字段的文本。我有一個要搜索的字段列表以及要搜索的文本。我也有一個初始查詢集來查詢。沿着這些路線的東西:用django orm動態搜索

def dynamic_search(queryset): 
    search_fields = ["search_field1", "search_field2", "search_field3"] 
    search_text = "dummy_text" 

    # I want to dynamically generate this query 
    qs.filter(Q(search_field1__contains=search_text) | Q(search_field2__contains=search_text) | Q(search_field3__contains=search_text)) 

問題是search_fields是一個通用的列表,所以我需要動態的查詢針對這些領域也是如此。有沒有在Django中做到這一點的好方法?

回答

1

您可以使用從運營商的建宏方法or_,列表理解和減少內建這樣的:

from django.db.models import Q 
import operator 


def dynamic_search(queryset): 
    search_fields = ["search_field1", "search_field2", "search_field3"] 
    search_text = "dummy_text" 
    queryset.filter(reduce(operator.or_, [Q(**{'{0}__contains'.format(search_field): search_text}) for search_field in search_fields])) 
0

不能確定某個特定的Django的一個,但你可以使用eval

N.B:這是一個壞主意,如果您使用用戶輸入,可能會導致所有類型的缺陷。 - 但如果你完全控制它,它應該沒問題。

x = [] 
for search_field in search_fields: 
    x.append(eval("qs.filter(Q({}__contains={})".format(search_field, search_text)) 

爲了方便起見,我在list中進行了存儲。如果您可以在Django查詢中使用|運算符 - 我不知道您可以,您可以將它分配給一個變量。