2013-07-09 27 views
0

我剛剛開始與python和Django,並尋找一種可能性迭代通過一個對象屬性,以實現所有領域的搜索功能。評估列表到Python中的對象屬性/ Django

diff對象類繼承自抽象基類,我創建了一個靜態函數searchable,它應該給予可以通過搜索的屬性。

class Item(BaseItem): 
    internal_ean = models.CharField(unique=True, max_length=20) 
    quantity = models.IntegerField(default=1) 

    @staticmethod 
    def searchable(): 
     return ['ean', 'internal_ean', 'brand', 'model'] 

沒有我想要做這樣的事情:

for key in Item.searchable(): 
    try: 
     string='{}={}'.format(key,term) 
     my_list.extend(getattr(Item.objects, "filter")(string)) 
    except (Item.DoesNotExist): 
     pass 

我能做些什麼來避免EVAL之類的東西?有沒有辦法返回一個指針或我可以直接使用的屬性列表?

從Django中我得到的結果:

ValueError: too many values to unpack 

回答

2

考慮以下代碼:

from django.db.models import Q 

def search_items_and_exact(term): 
    """Returns items with all searchable attributes exactly equals to term""" 
    filters = {} 
    for search_attr in Item.searchable(): 
     filters[search_attr] = term 
    return Item.objects.filter(**filters) 


def search_items_or_exact(term): 
    """Returns items with any searchable attributes exactly equals to term""" 
    q_seq = Q() 
    for search_attr in Item.searchable(): 
     filters = {search_attr: term} 
     q_seq = q_seq | Q(**filters) 
    return Item.objects.filter(q_seq) 

def search_items_and_contains(term, ignore_case=False): 
    """Returns items with all searchable attributes contains term""" 
    if ignore_case: 
     contains = 'icontains' 
    else: 
     contains = 'contains' 
    filters = {} 
    for search_attr in Item.searchable(): 
     filters["{0}__{1}".format(search_attr, contains)] = term 
    return Item.objects.filter(**filters) 

def search_items_or_contains(term, ignore_case=False): 
    """Returns items with any searchable attributes contains term""" 
    if ignore_case: 
     contains = 'icontains' 
    else: 
     contains = 'contains' 
    q_seq = Q() 
    for search_attr in Item.searchable(): 
     filters = {"{0}__{1}".format(search_attr, contains): term} 
     q_seq = q_seq | Q(**filters) 
    return Item.objects.filter(q_seq) 
+0

哇謝謝!這正是我需要的! –

3
qdict = dict.fromkeys(Item.searchable(), term) 
rquery = Item.objects.filter(**qdict) 
+0

哇!這很容易...我仍然需要從python學到很多:)謝謝! –

相關問題