0

我是 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

4 回答 4

2

你可以写:

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)

如果过滤器参数与表单字段具有相同的名称。

于 2010-02-16T01:10:28.263 回答
0

你可以尝试做:

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

如果你使用 try 会更好

try:
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
except:
    # do some error handling
于 2010-07-15T18:43:13.810 回答
0

我发现一些简单的方法是创建一个字典,如:

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

但这似乎不是这里的情况(marketingname != artname)

于 2010-02-16T01:12:12.500 回答
0

这应该工作:

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

于 2012-11-06T03:36:25.327 回答