2010-02-04 53 views
0

我刚刚开始使用Python,并且我被困在需要将一组request.POST参数转换为Solr查询语法的语法。将python字典转换为Solr查询字符串

的使用情况是这样定义的一种形式:

class SearchForm(forms.Form): 
    text = forms.CharField() 
    metadata = forms.CharField() 
    figures = forms.CharField() 

提交后,形式需要产生一个URL编码的字符串传递给一个URL的客户端,看起来像这样:

text:myKeyword1+AND+metadata:myKeyword2+AND+figures:myKeyword3 

似乎应该有一个简单的方法来做到这一点。我能得到的最接近的是

for f, v in request.POST.iteritems(): 
    if v: 
     qstring += u'%s\u003A%s+and+' % (f,v) 

然而,在这种情况下,冒号(\ u003A),因为它是没有得到正确编码生成Solr的错误。

干净的方法是什么?

谢谢!

回答

1

我建议在窗体中创建一个函数来处理这个问题,而不是在视图中。所以在你调用form.isValid()以确保数据是可接受的。你可以调用一个form.generateSolrQuery()(或者你想要的任何名字)。

class SearchForm(forms.Form): 
    text = forms.CharField() 
    metadata = forms.CharField() 
    figures = forms.CharField() 

    def generateSolrQuery(self): 
    return "+and+".join(["%s\u003A%s" % (f,v) for f,v in self.cleaned_data.items()]) 
+0

伟大的解决方案,谢谢!需要注意的是,我认为较新版本的python使用“cleaned_data”而不是“clean_data”。不知道这是否准确。 – andyashton 2010-02-06 02:56:44

+0

你的权利,这是一个错字。我修复了我原来的答案 – buckley 2010-02-06 18:09:23

0

是不是u'\u003A'就像u':'一样,它在URL中被转义为%3A

qstring = '+AND+'.join(
    [ u'%s%%3A%s'%(f,v) for f,v in request.POST.iteritems() if f] 
    ) 
+0

但urlencode构建了一个字符串,如text = myKeyword1&metadata = myKeyword2。这不是我需要的语法(参见上文)。我错过了什么吗? – andyashton 2010-02-04 22:55:21

+0

哎呦。应该仔细阅读。 – 2010-02-04 22:56:24

0

使用django-haystack。它负责所有与Solr的接口 - 索引和查询。

+0

谢谢!我会检查出来的。我已经在使用Solrpy了,这对我的目的来说看起来不错而且轻巧。 – andyashton 2010-02-05 13:22:00