2009-12-30 2 views
0

Base На URLКонтрольный запрос в Django (фильтр, объект Q)?

querydict = {customer_type:val1,tag:[], city:[],last_contact:valdate} 

show/?customer_type=All&tag=2,3&city=3&last_contact=29/12/2009 

Я буду фильтровать сделал метод:

def get_filter_result(customer_type, tag_selected, city_selected, last_contact_filled): 
    if customer_type=has value: 
     I filter by this 
     #queryset = Customer.objects.filter(Q(type__name=customer_type)) 
    if tag = has value : 
     I filter by this 
     #queryset = Customer.objects.filter(Q(type__name=customer_type) 
               Q(type__name=tag)) 
    if city = has value: 
     I filter by this 
     #queryset = Customer.objects.filter(Q(type__name=customer_type) 
               Q(type__name=tag), 
               Q(type__name=city)) 
    if last_contact = has value: 
     I filter by this 
     #queryset = Customer.objects.filter(Q(type__name=customer_type) 
               Q(type__name=tag), 
               Q(type__name=city), 
               Q(type__name=last_contact)) 

кто поможет дать представление о том, чтобы реализовать мой метод более простой и гибкой, чем это? если значение из них отсутствует или равен None (не передается значение Нет) так, если ... еще .... состояние будет контролировать alots времени и код будет больше ..

for example : 
     show/?customer_type=All&tag=&city=&last_contact= 
     show/?customer_type=All&tag=2,3&city=3&last_contact=29/12/2009 
     show/?customer_type=&tag=2,3&city=3&last_contact= 
     show/?customer_type=All&tag=2,3&city=&last_contact=29/12/2009 

благодаря

ответ

1
def get_filter_result(customer_type=None, tag_selected=None, city_selected=None, last_contact_filled=None): 
    qdict = {} 
    if customer_type is not None: 
     qdict['type__name'] = customer_type 
    if tag is not None: 
     <repeat as appropriate> 
    queryset = Customer.objects.filter(**qdict) 
1

Если вы хотите, и все ваши запросы (как в вашем примере), вы можете создать словарь параметров, а затем вызвать метод filter с этим словарем в качестве аргумента:

def get_filter_result(**kwargs): 
    params = {} 
    #delete items with empty strings 
    for key in kwargs: 
     if kwargs[key]: 
      params[key] = kwargs[key] 

    queryset = Customer.objects.filter(**params)