2010-02-04 5 views
0

Je ne fais que commencer avec Python, et je suis bloqué sur la syntaxe dont j'ai besoin pour convertir un ensemble de paramètres request.POST à ​​la syntaxe de requête de Solr.Traduire un dict python en une chaîne de requête Solr

Le cas d'utilisation est une forme définie comme ceci:

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

Sur présentation, le formulaire doit générer une chaîne codée url à passer à un client d'URL qui ressemble à ceci:

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

On dirait qu'il devrait y avoir un moyen simple de le faire. Le plus proche que je peux obtenir est

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

Cependant, dans ce cas, le côlon (\ u003A) génère une erreur Solr parce qu'il ne reçoit pas codé correctement.

Quelle est la manière propre de faire ceci?

Merci!

Répondre

1

Je vous recommande de créer une fonction dans le formulaire pour gérer cela plutôt que dans la vue. Donc, après avoir appelé form.isValid() pour vous assurer que les données sont acceptables. Vous pouvez appeler un formulaire.generateSolrQuery() (ou n'importe quel nom que vous souhaitez).

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

Excellente solution, merci! Juste pour noter, je pense que les nouvelles versions de python utilisent "clean_data" au lieu de "clean_data". Je ne sais pas si c'est exact cependant. – andyashton

+0

votre droit, c'était une faute de frappe. J'ai corrigé ma réponse originale – buckley

0

Est-ce que u'\u003A' est simplement identique à u':', qui est échappé dans les URL %3A?

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

Mais urlencode construit une chaîne comme text = myKeyword1 & metadata = myKeyword2. Ce n'est pas la syntaxe dont j'ai besoin (voir ci-dessus). Est-ce que je manque quelque chose? – andyashton

+0

Oups. Aurait dû lire de plus près. –

0

Utilisez django-haystack. Il prend en charge tous les interfaçage avec Solr - à la fois l'indexation et l'interrogation.

+0

Merci! Je vérifierai. J'utilise déjà Solrpy, ce qui me semble agréable et léger. – andyashton

Questions connexes