2016-02-19 185 views
0

我正在做关键字搜索。Django模型筛选器关键字

当用户输入一个关键词,它可能是 'order_num' 或 'CUSTOM_NAME',

当我做filter(Q(order_num=keyword) | Q(custom_name=keyword))

它提升一个值误差。

因为order_num是一个int,而custom_name是一个str。

如何使用关键字进行查询?

回答

1

你可以使用int(keyword)搜索关键词转化,但由于用户可能输入的字符串,则需要区分:

try: 
    result = Model.objects.filter(Q(order_num=int(keyword)) | 
            Q(custom_name=keyword)) 
except ValueError: 
    # no point to filter order_num because it's not a number anyway 
    result = Model.objects.filter(custom_name=keyword) 

编辑:

即使有多个字段,它会是相同的:

# create an empty Q() object to start with 
query = Q() 

try: 
    int_keyword = int(keyword) 
    query |= Q(order_num=int_keyword) 
    query |= Q(another_int_field=int_keyword) 
except ValueError: 
    pass 
# the string query would always be executed 
query |= Q(custom_name=keyword) 
query |= Q(other_field=keyword) 

results = Model.objects.filter(query) 
+0

如果我有3个字段需要过滤,那么我必须'尝试很多'。所以,任何更简单的方法来做这个查询? –

+0

我编辑了我的答案。只需在'try except'块中包装所有int字段查询就足够了。看看这是否有道理。 –