How can I make Django search in multiple fields using QuerySets and MySql "Full Text Search"? -
How can I make Django search in multiple fields using QuerySets and MySql "Full Text Search"? -
i'm django novice, trying create "search" form project using mysql myisam engine. far, manage form work, django doesn't seem search fields same way. results random. exemple: search in region
returns no result or worst search in description
works fine while howtogetin
doesn't seem apply..
here model:
class camp(models.model): owner = models.onetoonefield(user) name = models.charfield(max_length=100) description = models.textfield() address1 = models.charfield(max_length=128) address2 = models.charfield(max_length=128) zipcode = models.charfield(max_length=128) part = models.charfield(max_length=128) country = models.charfield(max_length=128) phone = models.charfield(max_length=60) howtogetin = models.textfield() def __str__(self): homecoming self.name
here view:
def campsearch(request): if request.method == 'post': form = campsearchform(request.post) if form.is_valid(): terms = form.cleaned_data['search'] camps = camp.objects.filter( q(name__search=terms)| q(description__search=terms)| q(address1__search=terms)| q(address2__search=terms)| q(zipcode__search=terms)| q(region__search=terms)| q(country__search=terms)| q(howtogetin__search=terms) ) homecoming render(request, 'campsearch.html', {'form':form, 'camps':camps}) else: form = campsearchform() homecoming render(request, 'campsearch.html', {'form':form})
any clue?
i'd recommend implement this:
#views.py def normalize_query(query_string, findterms=re.compile(r'"([^"]+)"|(\s+)').findall, normspace=re.compile(r'\s{2,}').sub): ''' splits query string in invidual keywords, getting rid of unecessary spaces , grouping quoted words together. example: >>> normalize_query(' random words "with quotes " , spaces') ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] ''' homecoming [normspace('',(t[0] or t[1]).strip()) t in findterms(query_string)] def get_query(query_string, search_fields): ''' returns query, combination of q objects. combination aims search keywords within model testing given search fields. ''' query = none # query search every search term terms = normalize_query(query_string) term in terms: or_query = none # query search given term in each field field_name in search_fields: q = q(**{"%s__icontains" % field_name: term}) if or_query none: or_query = q else: or_query = or_query | q if query none: query = or_query else: query = query & or_query homecoming query
and each search
#views.py def search_for_something(request): query_string = '' found_entries = none if ('q' in request.get) , request.get['q'].strip(): query_string = request.get['q'] entry_query = get_query(query_string, ['field1', 'field2', 'field3']) found_entries = model.objects.filter(entry_query).order_by('-something') homecoming render_to_response('app/template-result.html', { 'query_string': query_string, 'found_entries': found_entries }, context_instance=requestcontext(request) )
and in template
#template.html <form class="" method="get" action="{% url 'search_for_something' model.pk %}"> <input name="q" id="id_q" type="text" class="form-control" placeholder="search" /> <button type="submit">search</button> </form> #template-result.html {% if found_entries %} {% field in found_entries %} {{ model.field }} {% endfor %} {% endif %}
and url
#urls.py url(r'^results/$', 'app.views.search_for_something', name='search_for_something'),
mysql django python-2.7 full-text-search django-queryset
Comments
Post a Comment