使用表单域构建查询字符串

时间:2014-05-08 13:31:29

标签: python django

我有一个表单,它将一些参数发送到视图,我将此参数用作查询中的过滤器。搜索参数不是强制性的,当表单的字段留空时,我不会将其用作过滤条件。

我试图为查询创建字符串,但收到错误:“解压的值太多了”

有关可能发生的事情的任何想法?此外,任何更简单的方法的想法也将受到赞赏!

我的观点是这样的(在dict busca中,键是表单名称和值数据库字段为django模型)

def index(request):

a={}
busca={'marca':'brand = ', 'modelo':'model = ', 'tamano_min':'size >= '}
for i in request.POST:
    if i in ['marca', 'modelo', 'tamano_min']:
        valor=request.POST.get(i)
        a[i]=str.join(busca[i], valor)

query=list(a.values)
query=' and '.join(query)
latest_products = products.objects.filter(query, )

template = loader.get_template('search/index.html')
context = {'latest_products': latest_products}
return render(request, 'search/index.html', context)

1 个答案:

答案 0 :(得分:2)

不要通过构建自己的查询来重新发明轮子并使用Django ORM的强大功能。

例如:

marca = request.POST.get('marca')
modelo = request.POST.get('modelo')
tamano_min = request.POST.get('tamano_min')

latest_products = products.objects.filter(brand=marca, model=modelo, size__gte=tamano_min)
如果在字典中找不到参数,

get()有助于获取POST参数或None的值。
__gte结尾有助于添加>=条件。

您可能还想在使用前检查marcamodelotamano_min

latest_products = products.objects.all()
if marca is not None:
    latest_products = latest_products.filter(brand=marca)

等等。