我是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,
})
答案 0 :(得分: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)
如果过滤器参数与表单字段具有相同的名称。
答案 1 :(得分:0)
我发现简单的东西是创建一个字典,如:
query_dict = { 'marketingname' : art_name , 'marketingnumber'=art_number}
然后利用python的kwargs语法很好地传递它,即
Inventory.objects.filter(**query_dict)
要构建初始字典,如果您的cleaning_data键与您传递给filter()
的参数相对应,则可以使用列表理解。
query_dict = dict([ (k,v) for k,v in form.cleaned_data.items() if v ])
但这似乎不是这种情况(markettingname!= artname)
答案 2 :(得分:0)
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
答案 3 :(得分:0)
这应该有效:
Inventory.objects.filter(Q(marketingname = art_name)| Q(marketingnumber = art_number))