2009-12-30 2 views
0

base sur l'URLJeu de requêtes de contrôle dans Django (filtre, objet Q)?

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

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

Je vais filtrer par fait la méthode:

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)) 

Toute personne Aide donner une idée de mettre en œuvre ma méthode plus simple et flexible que cela? si la valeur d'entre eux sont manquants ou égaux Aucun (Aucune valeur est passée) donc si ... sinon .... état contrôlera alots du temps et le code sera plus ..

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 

grâce

Répondre

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

Si vous voulez et toutes vos requêtes (comme dans votre exemple), vous pouvez créer le dictionnaire des paramètres, puis appelez filter méthode avec ce dictionnaire comme argument:

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)