2010-02-04 52 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