Django Newbie - как удалить несколько полей в наборе запросов - PullRequest
0 голосов
/ 16 февраля 2010

Я новичок в Django, поэтому, пожалуйста, прости меня, если это глупый вопрос. У меня есть форма поиска, в которой есть несколько полей. Я хочу фильтровать мой набор запросов только по тем полям, которые не являются пустыми. Как я могу это сделать? Я знаю, что вы можете объединять наборы запросов и объекты Q вместе, но я не знаю, как удалить пустые пары ключ / значение из цепочки. Я знаю, что следующее не работает, но я подумал, что это может дать представление о том, что я ищу. Спасибо.

def art_search(request):
    if request.method == 'GET':
        form = AdvSearch(request.GET)
        if form.is_valid():
            art_name = form.cleaned_data['art_name']
            art_number = form.cleaned_data['art_number']
            artwork = Inventory.objects.filter(
                if art_name is not u'':
                    Q(marketingname=art_name),
                if art_number is not u'':
                    Q(marketingnumber=art_number)
            )
            return object_list(request, queryset=artwork)
    else:
        form = AdvSearch()
    return render_to_response('art/search.html', {
        'form': form,
    })

Ответы [ 4 ]

2 голосов
/ 16 февраля 2010

Вы можете написать:

if form.is_valid():
    opts = {}
    for key in form.cleaned_data:
        if form.cleaned_data[key] != '':
            opts[key] = form.cleaned_data[key]
    artwork = Inventory.objects.filter(**opts)
    return object_list(request, queryset=artwork)

Если параметры фильтра имеют те же имена, что и поля формы.

0 голосов
/ 06 ноября 2012

это должно работать:

Inventory.objects.filter (Q (marketingname = art_name) | Q (marketingnumber = art_number))

0 голосов
/ 15 июля 2010

вы можете попробовать сделать:

if art_name != '' and art_number != '':  
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)

еще лучше, если вы используете попробуйте

try:
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
except:
    # do some error handling
0 голосов
/ 16 февраля 2010

Что-то простое, что я нахожу, - это создать словарь вроде:

query_dict = { 'marketingname' : art_name , 'marketingnumber'=art_number}

Затем, используя синтаксис python kwargs, чтобы передать его, то есть

Inventory.objects.filter(**query_dict)

Для создания исходного словаря вы можете использовать понимание списка, если ваши ключи cleaned_data соответствуют параметрам, которые вы передаете filter().

query_dict = dict([ (k,v) for k,v in form.cleaned_data.items() if v ])

Но здесь, похоже, это не так (markettingname! = Artname)

...