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

База на URL

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(значение не передается), так что если... else.... условие будет контролировать много времени, и код будет больше..

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

Спасибо

2 ответа

Решение
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)

Если вы хотите И все ваши запросы (как в вашем примере), вы можете создать словарь параметров, а затем вызвать 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)
Другие вопросы по тегам