如何使用QuerySets和MySql“全文搜索”在多个字段中进行Django搜索?

前端之家收集整理的这篇文章主要介绍了如何使用QuerySets和MySql“全文搜索”在多个字段中进行Django搜索?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我是Django新手,试图使用带有MyISAM引擎的MySql为我的项目创建一个“搜索”表单.到目前为止,我设法让表单工作,但Django似乎不会以相同的方式搜索所有字段.结果是随机的.例子:搜索区域返回没有结果或最糟糕的搜索描述工作正常,而howtogetin似乎不适用..

这是我的模型:

  1. class Camp(models.Model):
  2. owner = models.OneToOneField(User)
  3. name = models.CharField(max_length=100)
  4. description = models.TextField()
  5. address1 = models.CharField(max_length=128)
  6. address2 = models.CharField(max_length=128)
  7. zipcode = models.CharField(max_length=128)
  8. region = models.CharField(max_length=128)
  9. country = models.CharField(max_length=128)
  10. phone = models.CharField(max_length=60)
  11. howtogetin = models.TextField()
  12. def __str__(self):
  13. return self.name

这是我的观点:

  1. def campsearch(request):
  2. if request.method == 'POST':
  3. form = CampSearchForm(request.POST)
  4. if form.is_valid():
  5. terms = form.cleaned_data['search']
  6. camps = Camp.objects.filter(
  7. Q(name__search=terms)|
  8. Q(description__search=terms)|
  9. Q(address1__search=terms)|
  10. Q(address2__search=terms)|
  11. Q(zipcode__search=terms)|
  12. Q(region__search=terms)|
  13. Q(country__search=terms)|
  14. Q(howtogetin__search=terms)
  15. )
  16. return render(request,'campsearch.html',{'form':form,'camps':camps})
  17. else:
  18. form = CampSearchForm()
  19. return render(request,{'form':form})

任何线索?

最佳答案
我建议你实现这个:

  1. #views.py
  2. def normalize_query(query_string,findterms=re.compile(r'"([^"]+)"|(\S+)').findall,normspace=re.compile(r'\s{2,}').sub):
  3. '''
  4. Splits the query string in invidual keywords,getting rid of unecessary spaces and grouping quoted words together.
  5. Example:
  6. >>> normalize_query(' some random words "with quotes " and spaces')
  7. ['some','random','words','with quotes','and','spaces']
  8. '''
  9. return [normspace(' ',(t[0] or t[1]).strip()) for t in findterms(query_string)]
  10. def get_query(query_string,search_fields):
  11. '''
  12. Returns a query,that is a combination of Q objects.
  13. That combination aims to search keywords within a model by testing the given search fields.
  14. '''
  15. query = None # Query to search for every search term
  16. terms = normalize_query(query_string)
  17. for term in terms:
  18. or_query = None # Query to search for a given term in each field
  19. for field_name in search_fields:
  20. q = Q(**{"%s__icontains" % field_name: term})
  21. if or_query is None:
  22. or_query = q
  23. else:
  24. or_query = or_query | q
  25. if query is None:
  26. query = or_query
  27. else:
  28. query = query & or_query
  29. return query

并为每次搜索

  1. #views.py
  2. def search_for_something(request):
  3. query_string = ''
  4. found_entries = None
  5. if ('q' in request.GET) and request.GET['q'].strip():
  6. query_string = request.GET['q']
  7. entry_query = get_query(query_string,['field1','field2','field3'])
  8. found_entries = Model.objects.filter(entry_query).order_by('-something')
  9. return render_to_response('app/template-result.html',{ 'query_string': query_string,'found_entries': found_entries },context_instance=RequestContext(request)
  10. )

并在模板中

  1. #template.html

和网址

  1. #urls.py
  2. url(r'^results/$','app.views.search_for_something',name='search_for_something'),

猜你在找的MySQL相关文章